写点什么

在 Python 中解析和修改 XML,你会么?

发布于: 2021 年 06 月 01 日

​​​​​​​​【本期推荐】8岁小朋友的儿童节,有点硬核,一起来认识这些小小程序员,看他们如何coding出一个与众不同的童年。


摘要: 我们经常需要解析用不同语言编写的数据。Python 提供了许多库来解析或拆分用其他语言编写的数据。在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML。


本文分享自华为云社区《从零开始学python| 如何在 Python 中解析和修改 XML?》,原文作者:Yuchuan。

 

我们经常需要解析用不同语言编写的数据。Python 提供了许多库来解析或拆分用其他语言编写的数据。在此 Python XML 解析器教程中,您将学习如何使用 Python 解析 XML。


以下是本教程中涵盖的所有主题:


Whatis XML?Python XML Parsing Modulesxml.etree.ElementTree Module

  • Usingparse() function

  • Usingfromstring() function

  • FindingElements of Interest

  • ModifyingXML files

  • Addingto XML

  • Deletingfrom XML

xml.dom.minidomModule

  • Usingparse() function

  • UsingfromString() function

  • FindingElements of Interest


让我们开始吧。:)

什么是 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>   两个 idly's with chutney    < /description>     <calories> 553 </calories> </food> <food>     <item name ="breakfast" > Paper Dosa </item>     <price> $2.7 </price>     <        <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>    藏红花甜拉瓦    </description>     <calories> 950 </calories> </食物> </元数据>
复制代码


上面的示例显示了我命名为“Sample.xml”的文件的内容,我将在此 Python 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 ETmytree = ET.parse('sample.xml')myroot = mytree.getroot()
复制代码


如您所见,您需要做的第一件事是导入 xml.etree.ElementTree 模块。然后, parse() 方法解析“Sample.xml”文件。getroot() 方法返回“Sample.xml”的根元素。


执行上述代码时,您不会看到返回的输出,但不会出现表明代码已成功执行的错误。要检查根元素,您可以简单地使用 print 语句,如下所示:


例子:


import xml.etree.ElementTree as ETmytree = ET.parse('sample.xml')myroot = mytree.getroot()print(myroot)
复制代码


输出:    <元素'元数据'在 0x033589F0>

上面的输出表明我们的 XML 文档中的根元素是“元数据”。

使用 fromstring() 函数:


您还可以使用 fromstring() 函数来解析您的字符串数据。如果要执行此操作,请将 XML 作为字符串传递给三引号,如下所示:


import xml.etree.ElementTree as ETdata='''<?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)
复制代码


输出:  元数据


您还可以通过指定要在输出中看到的字符串部分来对标签字符串输出进行切片。


例子:


print(myroot.tag[0:4])
复制代码


​输出:  


如前所述,标签也可以具有字典属性。要检查根标记是否具有任何属性,您可以使用“attrib”对象,如下所示:


例子:


print(myroot.attrib)
复制代码


​输出: {}


如您所见,输出是一个空字典,因为我们的根标签没有属性。


寻找感兴趣的元素:


根也由子标签组成。要检索根标记的子项,您可以使用以下命令:


例子:


print(myroot[0].tag)
复制代码


输出:食物


现在,如果要检索根的所有第一个子标签,可以使用 for 循环迭代它,如下所示:


例子:


for x in myroot[0]:     print(x.tag, x.attrib)
复制代码


​输出:

item{'name': 'breakfast'}价格 {}描述 {}卡路里 {}

返回的所有项目都是食物的子属性和标签。


要使用 ElementTree 将文本从 XML 中分离出来,您可以使用 text 属性。例如,如果我想检索有关第一个食品的所有信息,我应该使用以下代码:


例子:


for x in myroot[0]:        print(x.text)
复制代码


​输出:

懒懒地 $ 2.5 两悠闲地与酸辣酱的 553


可以看到,第一项的文本信息已经作为输出返回了。现在,如果您想显示具有特定价格的所有商品,您可以使用 get() 方法。此方法访问元素的属性。


例子:


for x in myroot.findall('food'):    item =x.find('item').text    price = x.find('price').text    print(item, price)
复制代码


​输出:

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')
复制代码


​输出:



如您所见,在第一个食品标签下添加了一个新标签。通过在 [] 括号内指定下标,您可以在任何地方添加标签。现在让我们看一下如何使用此模块删除项目。


从 XML 中删除:


要使用 ElementTree 删除属性或子元素,您可以使用 pop() 方法。此方法将删除用户不需要的所需属性或元素。


例子:


myroot[0][0].attrib.pop('name', None) # create a new XML file with the resultsmytree.write('output5.xml')
复制代码


输出:



上图显示 name 属性已从 item 标记中删除。要删除完整的标签,您可以使用相同的 pop() 方法,如下所示:


例子:


myroot[0].remove(myroot[0][0])mytree.write('output6.xml')
复制代码


输出:



输出显示食品标签的第一个子元素已被删除。如果要删除所有标签,可以使用 clear() 函数,如下所示:


例子:


myroot[0].clear()mytree.write('output7.xml')
复制代码


​输出:


执行上述代码时,food 标签的第一个子标签将被完全删除,包括所有子标签。到这里为止,我们一直在使用这个 Python XML 解析器教程中的 xml.etree.ElementTree 模块。现在让我们看看如何使用 Minidom 解析 XML。

xml.dom.minidom 模块:


这个模块基本上是由精通 DOM(文档对象模块)的人使用的。DOM 应用程序通常首先将 XML 解析为 DOM。在 xml.dom.minidom 中,这可以通过以下方式实现:


使用 parse() 函数:


第一种方法是通过提供要解析的 XML 文件作为参数来使用 parse() 函数。例如:


例子:


from xml.dom import minidomp1 = minidom.parse("sample.xml");
复制代码


执行此操作后,您将能够拆分 XML 文件并获取所需的数据。您还可以使用此函数解析打开的文件。


例子:


dat=open('sample.xml')p2=minidom.parse(dat)
复制代码


在这种情况下,存储打开文件的变量作为参数提供给解析函数。


使用 parseString() 方法:


当您想要提供要作为字符串解析的 XML 时,将使用此方法。


例子:


p3 = minidom.parseString('<myxml>Using<empty/> parseString</myxml>')
复制代码


您可以使用上述任何一种方法来解析 XML。现在让我们尝试使用此模块获取数据。


寻找感兴趣的元素:


在我的文件被解析后,如果我尝试打印它,返回的输出会显示一条消息,表明存储解析数据的变量是 DOM 对象。


例子:


dat=minidom.parse('sample.xml')print(dat)
复制代码


输出:

<xml.dom.minidom.Document 对象在 0x03B5A308>


使用 GetElementByTagName 访问元素:


例子:


tagname= dat.getElementsByTagName('item')[0]print(tagname)
复制代码


如果我尝试使用 GetElementByTagName 方法获取第一个元素,我将看到以下输出:


输出:

<DOM 元素:0xc6bd00 处的项目>


请注意,只返回了一个输出,因为为了方便我使用了 [0] 下标,这将在进一步的示例中删除。


要访问属性的值,我必须按如下方式使用 value 属性:


例子:


dat = minidom.parse('sample.xml')tagname= dat.getElementsByTagName('item')print(tagname[0].attributes['name'].value)
复制代码


输出:  早餐


要检索这些标签中存在的数据,您可以使用 data 属性,如下所示:


例子:


print(tagname[1].firstChild.data)
复制代码


输出: 纸 Dosa


您还可以使用 value 属性拆分和检索属性的值。


例子:


print(items[1].attributes['name'].value)
复制代码


输出: 早餐


要打印出我们菜单中可用的所有项目,您可以遍历这些项目并返回所有项目。


例子:


for x in items:    print(x.firstChild.data)
复制代码


输出:

袖手旁观纸 DOSAUPMA 碧斯百丽沐浴 Kesari 浴


要计算菜单上的项目数,您可以使用 len() 函数,如下所示:


例子:


print(len(items))
复制代码


​输出指定我们的菜单包含 5 个项目。


这使我们结束了本 Python XML 解析器教程。我希望你已经清楚地了解了一切。


点击关注,第一时间了解华为云新鲜技术~

发布于: 2021 年 06 月 01 日阅读数: 24
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
在 Python 中解析和修改 XML,你会么?