关于python:了解女朋友的心还不如了解Python之在Python中解析和修改XML

30次阅读

共计 5461 个字符,预计需要花费 14 分钟才能阅读完成。

摘要:工作中咱们时常须要解析用不同语言编写的数据。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 专门设计用于在客户端和服务器之间来回发送和接收数据。看看上面的例子:

例子:

        Idly       $2.5         两个 idly's with chutney
    < /description>
      553         Paper Dosa       $2.7      <
         700         Upma       $3.65           Rava upma with bajji
           600         Bisi Bele Bath       $4.50         Bisi Bele Bath with sev
           400        Kesari Bath       $1.95          藏红花甜拉瓦
          950

下面的示例显示了我命名为“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 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)

输入:

下面的输入表明咱们的 XML 文档中的根元素是“元数据”。

应用 fromstring() 函数:

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

import xml.etree.ElementTree as ET
data='''Idly    $2.5       Two idly's with chutney
       553'''
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 results
mytree.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 minidom
p1 = minidom.parse("sample.xml");

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

例子:

dat=open('sample.xml')
p2=minidom.parse(dat)

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

应用 parseString() 办法:

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

例子:

p3 = minidom.parseString('Using parseString')

您能够应用上述任何一种办法来解析 XML。当初让咱们尝试应用此模块获取数据。

寻找感兴趣的元素:

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

例子:

dat=minidom.parse('sample.xml')
print(dat)

输入:

应用 GetElementByTagName 拜访元素:

例子:

tagname= dat.getElementsByTagName('item')\[0\]
print(tagname)

如果我尝试应用 GetElementByTagName 办法获取第一个元素,我将看到以下输入:

输入:

请留神,只返回了一个输入,因为为了不便我应用了 [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 解析器教程。

最初

文章对你有帮忙的话,记得帮作者点点赞
接下来还会继续跟新无关 Python 的文章,点点关注不迷路。

正文完
 0