Python 操作XML文件一文通

3周前 (11-12 20:28)阅读1回复0
东乐
东乐
  • 管理员
  • 注册排名3
  • 经验值85050
  • 级别管理员
  • 主题17010
  • 回复0
楼主

菜鸟学Python”,选择“星标”公家号

超等无敌干货,第一时间送达!!!

各人好,我是菜鸟哥。

我们经常需要解析用差别语言编写的数据,Python 供给了许多第三方库来解析或拆分用其他语言编写的数据,今天我们来进修下 Python XML 解析器的相关功用。

Python 操做XML文件一文通

下面一路来看看吧~

什么是 XML?

XML 是可扩展标识表记标帜语言,它在外不雅上类似于 HTML,但 XML 用于数据暗示,而 HTML 用于定义正在利用的数据。XML 专门设想用于在客户端和办事器之间来回发送和领受数据。看看下面的例子:

<?xml version="1.0" encoding="UTF-8"?>

< metadata>

< food>

< itemname= "breakfast"> Idly </ item>

< price> $2.5 </ price>

< deion>

Two idly's with chutney

</ deion>

< calories> 553 </ calories>

展开全文

</ food>

< food>

< itemname= "breakfast"> Paper Dosa </ item>

< price> $2.7 </ price>

< deion>

Plain paper dosa with chutney

</ deion>

< calories> 700 </ calories>

</ food>

< food>

< itemname= "breakfast"> Upma </ item>

< price> $3.65 </ price>

< deion>

Rava upma with bajji

</ deion>

< calories> 600 </ calories>

</ food>

< food>

< itemname= "breakfast"> Bisi Bele Bath </ item>

< price> $4.50 </ price>

< deion>

Bisi Bele Bath with sev

</ deion>

< calories> 400 </ calories>

</ food>

< food>

< itemname= "breakfast"> Kesari Bath </ item>

< price> $1.95 </ price>

< deion>

Sweet rava with saffron

</ deion>

< calories> 950 </ calories>

</ food>

</ metadata>

上面的示例显示了定名为“Sample.xml”的文件的内容,后面的代码示例城市基于此 XML 例子来停止。

Python XML 解析模块

xml.etree.ElementTree 模块:

该模块帮忙我们将 XML 数据格局化为树构造,那是分层数据的最天然暗示。元素类型允许在内存中存储分层数据构造,并具有以部属性:

Property

Deion

Tag

一个字符串,暗示正在存储的数据类型

Attributes

由存储为字典的许多属性构成

Text String

包罗需要显示的信息的文本字符串

Tail String

若有需要,也能够有尾弦

Child Elements

由许多存储为序列的子元素构成

ElementTree 是一个封拆元素构造并允许与 XML 彼此转换的类,如今让我们测验考试利用 python 模块解析上述 XML 文件。

有两种办法能够利用 ElementTree 模块解析文件。

第一个是利用 parse 函数,第二个是 fromstring 函数。 parse 函数解析做为文件供给的 XML 文档,而 fromstring 在做为字符串供给时解析 XML,即在三引号内。

利用 parse 函数:

如前所述,该函数接纳文件格局的 XML 停止解析,看看下面的例子:

importxml.etree.ElementTree asET

mytree = ET.parse( 'sample.xml')

myroot = mytree.getroot

我们需要做的第一件事是导入 xml.etree.ElementTree 模块,然后利用 parse 办法解析“Sample.xml”文件, getroot 办法返回“Sample.xml”的根元素。

当施行上述代码时,我们不会看到返回的输出,但只要不会有错误就表白代码已胜利施行。要查抄根元素,能够简单地利用 print 语句,如下所示:

importxml.etree.ElementTree asET

mytree = ET.parse( 'sample.xml')

myroot = mytree.getroot

print(myroot)

Output:

<Element ‘metadata’ at 0x033589F0>

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

利用 fromstring 函数

我们还能够利用 fromstring 函数来解析字符串数据,我们需要将 XML 做为三引号内的字符串传递,如下所示:

importxml.etree.ElementTree asET

data= '''<?xml version="1.0" encoding="UTF-8"?>

<metadata>

<food>

<item name="breakfast">Idly</item>

<price>$2.5</price>

<deion>

Two idly's with chutney

</deion>

<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 轮回对其停止迭代,如下所示:

forx inmyroot[ 0]:

print(x.tag, x.attrib)

Output:

item {‘name’: ‘breakfast’}

price {}

deion {}

calories {}

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

要利用 ElementTree 从 XML 平分离出文本,能够利用 text 属性。例如,若是想检索关于第一个食物的所有信息,应该利用以下代码:

forx inmyroot[ 0]:

print(x.text)

Output:

Idly

$2.5

Two idly’s with chutney

553

能够看出,第一项的文本信息已做为输出返回。如今若是想以特订价格显示所有商品,能够利用 get 办法,此办法拜候元素的属性。

forx inmyroot.findall( 'food'):

item =x.find( 'item').text

price = x.find( 'price').text

print(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:

以下示例显示了若何在项目描述中添加内容。

fordeion inmyroot.iter( 'deion'):

new_desc = str(deion.text)+ 'wil be served'

deion.text = str(new_desc)

deion.set( 'updated', 'yes')

mytree.write( 'new.xml')

write 函数有助于创建一个新的 xml 文件并将更新的输出写入该文件,但是也能够利用不异的功用修改原始文件。施行上述代码后,将可以看到已创建一个包罗更新成果的新文件。

上图显示了我们食物项目标修改描述。要添加新的子标签,能够利用 SubElement 办法。例如,若是想在第一项 Idly 中添加新的专业标签,能够施行以下操做:

ET.SubElement(myroot[ 0], 'speciality')

forx inmyroot.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:

Python 操做XML文件一文通

上图显示 name 属性已从 item 标识表记标帜中删除。要删除完好的标签,能够利用不异的 pop 办法,如下所示:

myroot[ 0].remove(myroot[ 0][ 0])

mytree.write( 'output6.xml')

Output:

Python 操做XML文件一文通

输出显示食物标签的第一个子元素已被删除。若是要删除所有标签,能够利用 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 函数。例如:

fromxml.dom importminidom

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

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

forx initems:

print(x.firstChild.data)

Output:

Idly

Paper Dosa

Upma

Bisi Bele Bath

Kesari Bath

要计算我们菜单上的项目数,能够利用 len 函数,如下所示:

print(len(items))

Output:

5

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

入门: 最全的零根底学Python的问题 | 零根底学了8个月的Python |实战项目 | 学Python就是那条捷径

干货:爬取豆瓣短评,片子《后来的我们》 | 38年NBA更佳球员阐发 |从万寡等待到口碑扑街!唐探3令人绝望 | 笑看新倚天屠龙记 | 灯谜答题王 | 用Python做个海量蜜斯姐素描图 | 碟中谍那么火,我用机器进修做个迷你保举系统片子

兴趣:弹球游戏 | 九宫格 | 标致的花 | 两百行Python《天天酷跑》游戏!

AI:会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍那么火,我用机器进修做个迷你保举系统片子

小东西: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保留为pdf! |再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 造做一款钉钉低价机票提醒器! |60行代码做了一个语音壁纸切换器天天看蜜斯姐! |

年度爆款案牍

1). 卧槽!Pdf转Word用Python轻松搞定 !

2).学Python实香!我用100行代码做了个网站,帮人PS游览图片,赚个鸡腿吃

3).首播过亿,火爆全网,我阐发了《披荆斩棘的姐姐》,发现了那些奥秘

4). 80行代码!用Python做一个哆来A梦分身

5).你必需掌握的20个python代码,短小精悍,用途无限

6). 30个Python奇淫技巧集

7). 我总结的80页《菜鸟学Python精选干货.pdf》,都是干货

8). 再见Python!我要学Go了!2500字深度阐发 !

9).发现一个舔狗福利!那个Python爬虫神器太爽了,主动下载妹子图片

0
回帖

Python 操作XML文件一文通 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息