音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

分析如何在Python中解析和修改XML
日期:2021-09-08 14:47:58   来源:脚本之家

一、什么是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数据。

2.1、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)

输出:

<元素'元数据'在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)

输出:

元数据

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

例子:

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。

2.2、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('<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)

输出:

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

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

例子:

print(len(items))

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

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

以上就是分析如何在Python中解析和修改XML的详细内容,更多关于Python解析和修改XML的资料请关注其它相关文章!

    下一篇:没有文章

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程