Python 操作XML文件一文通
我们经常需要解析用不同语言编写的数据,Python 提供了许多第三方库来解析或拆分用其他语言编写的数据,今天我们来学习下 Python XML 解析器的相关功能。
下面一起来看看吧~
什么是 XML?
XML 是可扩展标记语言,它在外观上类似于 HTML,但 XML 用于数据表示,而 HTML 用于定义正在使用的数据。XML 专门设计用于在客户端和服务器之间来回发送和接收数据。看看下面的例子:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<food><item name="breakfast">Idly</item><price>$2.5</price><description>Two idly's with chutney</description><calories>553</calories>
</food>
<food><item name="breakfast">Paper Dosa</item><price>$2.7</price><description>Plain paper dosa with chutney</description><calories>700</calories>
</food>
<food><item name="breakfast">Upma</item><price>$3.65</price><description>Rava upma with bajji</description><calories>600</calories>
</food>
<food><item name="breakfast">Bisi Bele Bath</item><price>$4.50</price><description>Bisi Bele Bath with sev</description><calories>400</calories>
</food>
<food><item name="breakfast">Kesari Bath</item><price>$1.95</price><description>Sweet rava with saffron</description><calories>950</calories>
</food>
</metadata>
上面的示例显示了命名为“Sample.xml”的文件的内容,后面的代码示例都会基于此 XML 例子来进行。
Python XML 解析模块
Python 允许使用两个模块解析这些 XML 文档,即 xml.etree.ElementTree 模块和 Minidom(最小 DOM 实现)。解析意味着从文件中读取信息,并通过识别特定 XML 文件的各个部分将其拆分为多个片段。让我们进一步了解如何使用这些模块来解析 XML 数据。
xml.etree.ElementTree 模块:
该模块帮助我们将 XML 数据格式化为树结构,这是分层数据的最自然表示。元素类型允许在内存中存储分层数据结构,并具有以下属性:
ElementTree 是一个封装元素结构并允许与 XML 相互转换的类,现在让我们尝试使用 python 模块解析上述 XML 文件。
有两种方法可以使用ElementTree模块解析文件。
第一个是使用 parse() 函数,第二个是 fromstring() 函数。 parse() 函数解析作为文件提供的 XML 文档,而 fromstring 在作为字符串提供时解析 XML,即在三引号内。
使用 parse() 函数:
如前所述,该函数采用文件格式的 XML 进行解析,看看下面的例子:
import xml.etree.ElementTree as ET
mytree = ET.parse('sample.xml')
myroot = mytree.getroot()
我们需要做的第一件事是导入 xml.etree.ElementTree 模块,然后使用 parse() 方法解析“Sample.xml”文件,getroot() 方法返回“Sample.xml”的根元素。
当执行上述代码时,我们不会看到返回的输出,但只要不会有错误就表明代码已成功执行。要检查根元素,可以简单地使用 print 语句,如下所示:
import xml.etree.ElementTree as ET
mytree = ET.parse('sample.xml')
myroot = mytree.getroot()
print(myroot)
Output:
<Element ‘metadata’ at 0x033589F0>
上面的输出表明我们的 XML 文档中的根元素是“元数据”。
使用 fromstring() 函数
我们还可以使用 fromstring() 函数来解析字符串数据,我们需要将 XML 作为三引号内的字符串传递,如下所示:
import xml.etree.ElementTree as ET
data='''<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<food><item name="breakfast">Idly</item><price>$2.5</price><description>Two idly's with chutney</description><calories>553</calories>
</food>
</metadata>
'''
myroot = ET.fromstring(data)
#print(myroot)
print(myroot.tag)
上面的代码将返回与前一个相同的输出,用作字符串的 XML 文档只是“Sample.xml”的一部分,已将其用于提高可见性,也可以使用完整的 XML 文档。
还可以使用“标签”对象检索根标签,如下所示:
print(myroot.tag)
Output:
metadata
还可以通过仅指定要在输出中看到的字符串部分来对标记字符串输出进行切片。
print(myroot.tag[0:4])
Output:
meta
如前所述,标签也可以具有字典属性。要检查根标签是否有任何属性,您可以使用“attrib”对象,如下所示:
print(myroot.attrib)
Output:
{}
可以看到,输出是一个空字典,因为我们的根标签没有属性。
寻找感兴趣的元素
根也由子标签组成,要检索根标签的子标签,可以使用以下命令:
print(myroot[0].tag)
Output:
food
现在,如果要检索根的所有第一个子标记,可以使用 for 循环对其进行迭代,如下所示:
for x in myroot[0]:print(x.tag, x.attrib)
Output:
item {‘name’: ‘breakfast’}
price {}
description {}
calories {}
返回的所有项目都是食物的子属性和标签。
要使用 ElementTree 从 XML 中分离出文本,可以使用 text 属性。 例如,如果想检索关于第一个食物的所有信息,应该使用以下代码:
for x in myroot[0]:print(x.text)
Output:
Idly
$2.5
Two idly’s with chutney
553
可以看出,第一项的文本信息已作为输出返回。现在如果想以特定价格显示所有商品,可以使用 get() 方法,此方法访问元素的属性。
for x in myroot.findall('food'):item =x.find('item').textprice = x.find('price').textprint(item, price)
Output:
Idly $2.5
Paper Dosa $2.7
Upma $3.65
Bisi Bele Bath $4.50
Kesari Bath $1.95
上面的输出显示了所有必需的项目以及每个项目的价格,使用 ElementTree,还可以修改 XML 文件。
修改 XML 文件
我们的 XML 文件中的元素是可以被操纵的,为此,可以使用 set() 函数。让我们先来看看如何在 XML 中添加一些东西。
添加到 XML:
以下示例显示了如何在项目描述中添加内容。
for description in myroot.iter('description'):new_desc = str(description.text)+'wil be served'description.text = str(new_desc)description.set('updated', 'yes')mytree.write('new.xml')
write() 函数有助于创建一个新的 xml 文件并将更新的输出写入该文件,但是也可以使用相同的功能修改原始文件。执行上述代码后,将能够看到已创建一个包含更新结果的新文件。
上图显示了我们食品项目的修改描述。要添加新的子标签,可以使用 SubElement() 方法。例如,如果想在第一项 Idly 中添加新的专业标签,可以执行以下操作:
ET.SubElement(myroot[0], 'speciality')
for x in myroot.iter('speciality'):new_desc = 'South Indian Special'x.text = str(new_desc)mytree.write('output5.xml')
Output:
就像我们所见到的,在第一个食物标签下添加了一个新标签。可以通过在 [] 括号内指定下标来在任意位置添加标签。
下面让我们看看如何使用这个模块删除项目。
从 XML 中删除:
要使用 ElementTree 删除属性或子元素,可以使用 pop() 方法,此方法将删除用户不需要的所需属性或元素。
myroot[0][0].attrib.pop('name', None)# create a new XML file with the results
mytree.write('output5.xml')
Output:
上图显示 name 属性已从 item 标记中删除。要删除完整的标签,可以使用相同的 pop() 方法,如下所示:
myroot[0].remove(myroot[0][0])
mytree.write('output6.xml')
Output:
输出显示食品标签的第一个子元素已被删除。如果要删除所有标签,可以使用 clear() 函数,如下所示:
myroot[0].clear()
mytree.write('output7.xml')
执行上述代码时,food 标签的第一个子标签将被完全删除,包括所有子标签。
到目前为止,我们一直在使用 Python XML 解析器中的 xml.etree.ElementTree 模块。现在让我们看看如何使用 Minidom 解析 XML。
xml.dom.minidom Module
该模块基本上是由精通DOM(文档对象模块)的人使用的,DOM 应用程序通常首先将 XML 解析为 DOM。在 xml.dom.minidom 中,可以通过以下方式实现
使用 parse() 函数:
第一种方法是通过提供要解析的 XML 文件作为参数来使用 parse()函数。例如:
from xml.dom import minidom
p1 = minidom.parse("sample.xml")
执行此操作后,将能够拆分 XML 文件并获取所需的数据。还可以使用此函数解析打开的文件。
dat=open('sample.xml')
p2=minidom.parse(dat)
在这种情况下,存储打开文件的变量作为参数提供给 parse 函数。
使用 parseString() 方法:
当我们想要提供要作为字符串解析的 XML 时使用此方法。
p3 = minidom.parseString('<myxml>Using<empty/> parseString</myxml>')
可以使用上述任何方法解析 XML,现在让我们尝试使用这个模块获取数据
寻找感兴趣的元素
在我的文件被解析后,如果我们尝试打印它,返回的输出会显示一条消息,即存储解析数据的变量是 DOM 的对象。
dat=minidom.parse('sample.xml')
print(dat)
Output:
<xml.dom.minidom.Document object at 0x03B5A308>
使用 GetElementsByTagName 访问元素
tagname= dat.getElementsByTagName('item')[0]
print(tagname)
如果我们尝试使用 GetElementByTagName 方法获取第一个元素,我将看到以下输出:
<DOM Element: item at 0xc6bd00>
请注意,只返回了一个输出,因为为方便起见,这里使用了 [0] 下标,这将在进一步的示例中被删除。
要访问属性的值,我们将不得不使用 value 属性,如下所示:
dat = minidom.parse('sample.xml')
tagname= dat.getElementsByTagName('item')
print(tagname[0].attributes['name'].value)
Output:
breakfast
要检索这些标签中存在的数据,可以使用 data 属性,如下所示:
print(tagname[1].firstChild.data)
Output:
Paper Dosa
还可以使用 value 属性拆分和检索属性的值。
print(items[1].attributes['name'].value)
Output:
breakfast
要打印出我们菜单中的所有可用项目,可以遍历这些项目并返回所有项目。
for x in items:print(x.firstChild.data)
Output:
Idly
Paper Dosa
Upma
Bisi Bele Bath
Kesari Bath
要计算我们菜单上的项目数,可以使用 len() 函数,如下所示:
print(len(items))
Output:
5
输出指定我们的菜单包含 5 个项目。
现在我邀请你进入我们的软件测试学习交流群:【
746506216
】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!
Python 操作XML文件一文通相关推荐
- python操作XML格式文件
python操作XML格式文件 python操作XML格式文件 1. 读取文件和内容 2.读取节点数据 3.修改和删除节点 4.构建文档 python操作XML格式文件 可扩展标记语言,是一种简单的数 ...
- [PYTHON] 对XML文件进行增删改查操作
PYTHON 操作 XML 读取XML文件 关于XML的介绍 <data> 与 </data> 是一对标签的开始与结束 <property - /> 也是一个正确的 ...
- python 处理xml文件
XML可扩展标记语言(eXtensible Markup Language),被设计用来传输和存储数据. <?xml version="1.0" encoding=" ...
- python入门教程2word-入门干货:Python操作Word文件经验分享
原标题:入门干货:Python操作Word文件经验分享 导读:Microsoft Word在当前使用中是占有巨大优势的文字处理器,这使得Word专用的档案格式Word 文件(.docx)成为事实上最通 ...
- python读xml文件生成头文件_Python根据指定文件生成XML的方法
因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...
- 写了一个操作XML文件的类
一个操作XML文件的类..部份功能在完善中~~~~ using System; using System.Collections.Generic; using System.Text; using S ...
- python生成xml文件工具_Python根据指定文件生成XML的方法
因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...
- 详解Python操作Excel文件
前言 本篇文章主要总结了一下利用python操作Excel文件的第三方库和方法. 常见库简介 1.xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件. 地 ...
- python修改xml标签的值_对python修改xml文件的节点值方法详解
这是我的xml文件结构 <?xml version='1.0' encoding='utf-8'?> JPEGImages train_2018-05-08_1000.jpg D:\all ...
最新文章
- 百度飞桨成为北京市首个AI产业方向创新应用平台
- MER: 基于ITS区域marker扩增真菌群落的准确性
- RTX软件用友OA冲突解决
- Spring @CrossOrigin 通配符 解决跨域问题
- 数据结构-树2-二叉树各种函数实现
- 获取存储过程返回值及代码中获取返回值(转)
- JVM 方法调用之动态分派
- js打印(控件)及多种方式
- 华为S9303三层交换机一次配置经历和心得
- mysql cluster 1186_配置Mysql Cluster时出错Unable to connect with connect string_MySQL
- 【离散数学】数理逻辑 第一章 命题逻辑(2) 命题公式及其符号化、命题公式的赋值
- QQ文件路径,QQ图片保存地址
- 开源生态研究与实践| ChinaOSC
- sip gw功能包括_米尔MYD-C335X-GW开发板,为工业网关量身打造
- 简单教你贴-iPhone新一代超薄卡贴
- 管理职工工资属于计算机什么应用领域,计算机练习题
- 为什么香肠能激活手机屏幕,手套不能
- 《Adobe Fireworks CS5中文版经典教程》——1.7复习
- box-sizing: border-box;失效问题
- nasdaq qcom_高通(NASDAQ:QCOM)应该关注台湾半导体制造公司
热门文章
- Ubuntu 16.04安装有道词典
- 2019, XII Samara Regional Intercollegiate Programming Contest 全部题解
- 实际上Ubuntu在你最起初配置完系统以后,是无法访问root类型的操作的(下面详解),ubuntu系统网络设置方法(图文)
- Urlencode编码对HTTP的URL地址的作用的探究(20210519更新,最终结论得出,XSS相关)
- postgres内存上下文
- 大学STEM教育的技能水平和收获
- 苹果公司的企业文化_【全景标杆】乔布斯给苹果留下了什么样的企业文化?
- pca降维python实例_主成分分析(Principal component analysis, PCA)例子–Python | 文艺数学君...
- Python 经纬度,偏航角,距离计算
- 树莓派控制Dobot遇到的问题