国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python利用ElementTree模塊處理XML的方法詳解

2019-11-25 15:53:33
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

最近因?yàn)楣ぷ鞯男枰?,在使?Python 來(lái)發(fā)送 SOAP 請(qǐng)求以測(cè)試 Web Service 的性能,由于 SOAP 是基于 XML 的,故免不了需要使用 python 來(lái)處理 XML 數(shù)據(jù)。在對(duì)比了幾種方案后,最后選定使用 xml.etree.ElementTree 模塊來(lái)實(shí)現(xiàn)。

這篇文章記錄了使用 xml.etree.ElementTree 模塊常用的幾個(gè)操作,也算是總結(jié)一下,免得以后忘記了。分享出來(lái)也方法需要的朋友們參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。

概述

對(duì)比其他 Python 處理 XML 的方案,xml.etree.ElementTree 模塊(下文我們以 ET 來(lái)表示)相對(duì)來(lái)說(shuō)比較簡(jiǎn)單,接口也較友好。

官方文檔 里面對(duì) ET 模塊進(jìn)行了較為詳細(xì)的描述,總的來(lái)說(shuō),ET 模塊可以歸納為三個(gè)部分:ElementTree類,Element類以及一些操作 XML 的函數(shù)。

XML 可以看成是一種樹(shù)狀結(jié)構(gòu),ET 使用ElementTree類來(lái)表示整個(gè) XML 文檔,使用Element類來(lái)表示 XML 的一個(gè)結(jié)點(diǎn)。對(duì)整 XML 文檔的操作一般是對(duì)ElementTree對(duì)象進(jìn)行,而對(duì) XML 結(jié)點(diǎn)的操作一般是對(duì)Element對(duì)象進(jìn)行。

解析 XML 文件

ET 模塊支持從一個(gè) XML 文件構(gòu)造ElementTree對(duì)象,例如我們的 XML 文件example.xml內(nèi)容如下(下文會(huì)繼續(xù)使用這個(gè) XML 文檔):

<?xml version="1.0" encoding="utf-8"?><data> <country name="Liechtenstein">  <rank>1</rank>  <year>2008</year>  <gdppc>141100</gdppc>  <neighbor name="Austria" direction="E"/>  <neighbor name="Switzerland" direction="W"/> </country> <country name="Singapore">  <rank>4</rank>  <year>2011</year>  <gdppc>59900</gdppc>  <neighbor name="Malaysia" direction="N"/> </country></data>

可以使用 ET 模塊的parse()函數(shù)來(lái)從指定的 XML 文件構(gòu)造一個(gè)ElementTree對(duì)象:

import xml.etree.ElementTree as ET# 獲取 XML 文檔對(duì)象 ElementTreetree = ET.parse('example.xml')# 獲取 XML 文檔對(duì)象的根結(jié)點(diǎn) Elementroot = tree.getroot()# 打印根結(jié)點(diǎn)的名稱print root.tag

從 XML 文件構(gòu)造好ElementTree對(duì)象后,還可以獲取其結(jié)點(diǎn),或者再繼續(xù)對(duì)結(jié)點(diǎn)進(jìn)行進(jìn)一步的操作。

解析 XML 字符串

ET 模塊的fromstring()函數(shù)提供從 XML 字符串構(gòu)造一個(gè)Element對(duì)象的功能。

xml_str = ET.tostring(root)print xml_strroot = ET.fromstring(xml_str)print root.tag

接著上面的代碼,我們使用 ET 模塊的tostring()函數(shù)來(lái)將上面我們構(gòu)造的root對(duì)象轉(zhuǎn)化為字符串,然后使用fromstring()函數(shù)重新構(gòu)造一個(gè)Element對(duì)象,并賦值給root變量,這時(shí)root代表整個(gè) XML 文檔的根結(jié)點(diǎn)。

構(gòu)造 XML

如果我們需要構(gòu)造 XML 文檔,可以使用 ET 模塊的 Element類以及SubElement()函數(shù)。

可以使用Element類來(lái)生成一個(gè)Element對(duì)象作為根結(jié)點(diǎn),然后使用ET.SubElement()函數(shù)生成子結(jié)點(diǎn)。

a = ET.Element('a')b = ET.SubElement(a, 'b')b.text = 'leehao.me'c = ET.SubElement(a, 'c')c.attrib['greeting'] = 'hello'd = ET.SubElement(a, 'd')d.text = 'www.leehao.me'xml_str = ET.tostring(a, encoding='UTF-8')print xml_str

輸出:

<?xml version='1.0' encoding='UTF-8'?><a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>

如果需要輸出到文件中,可以繼續(xù)使用ElementTree.write()方法來(lái)處理:

# 先構(gòu)造一個(gè) ElementTree 以便使用其 write 方法tree = ET.ElementTree(a)tree.write('a.xml', encoding='UTF-8')

執(zhí)行后,便會(huì)生成一個(gè) XML 文件a.xml:

<?xml version='1.0' encoding='UTF-8'?><a><b>leehao.me</b><c greeting="hello" /><d>www.leehao.me</d></a>

XML 結(jié)點(diǎn)的查找與更新

1. 查找 XML 結(jié)點(diǎn)

Element類提供了Element.iter()方法來(lái)查找指定的結(jié)點(diǎn)。Element.iter()會(huì)遞歸查找所有的子結(jié)點(diǎn),以便查找到所有符合條件的結(jié)點(diǎn)。

# 獲取 XML 文檔對(duì)象 ElementTreetree = ET.parse('example.xml')# 獲取 XML 文檔對(duì)象的根結(jié)點(diǎn) Elementroot = tree.getroot()# 遞歸查找所有的 neighbor 子結(jié)點(diǎn)for neighbor in root.iter('neighbor'): print neighbor.attrib

輸出:

{'direction': 'E', 'name': 'Austria'}{'direction': 'W', 'name': 'Switzerland'}{'direction': 'N', 'name': 'Malaysia'}

如果使用Element.findall()或者Element.find()方法,則只會(huì)從結(jié)點(diǎn)的直接子結(jié)點(diǎn)中查找,并不會(huì)遞歸查找。

for country in root.findall('country'): rank = country.find('rank').text name = country.get('name') print name, rank

輸出:

Liechtenstein 1Singapore 4

2. 更新結(jié)點(diǎn)

如果需要更新結(jié)點(diǎn)的文本,可以通過(guò)直接修改Element.text來(lái)實(shí)現(xiàn)。如果需要更新結(jié)點(diǎn)的屬性,可以通過(guò)直接修改Element.attrib來(lái)實(shí)現(xiàn)。

對(duì)結(jié)點(diǎn)進(jìn)行更新后,可以使用ElementTree.write()方法將更新后的 XML 文檔寫(xiě)入文件中。

# 獲取 XML 文檔對(duì)象 ElementTreetree = ET.parse('example.xml')# 獲取 XML 文檔對(duì)象的根結(jié)點(diǎn) Elementroot = tree.getroot()for rank in root.iter('rank'): new_rank = int(rank.text) + 1 rank.text = str(new_rank) rank.attrib['updated'] = 'yes'tree.write('output.xml', encoding='UTF-8')

新生成的output.xml文件以下:

<?xml version='1.0' encoding='UTF-8'?><data> <country name="Liechtenstein">  <rank updated="yes">2</rank>  <year>2008</year>  <gdppc>141100</gdppc>  <neighbor direction="E" name="Austria" />  <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore">  <rank updated="yes">5</rank>  <year>2011</year>  <gdppc>59900</gdppc>  <neighbor direction="N" name="Malaysia" /> </country></data>

對(duì)比example.xml文件,可以看到output.xml文件已更新。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

參考資料

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 桓台县| 通辽市| 榕江县| 司法| 石棉县| 和林格尔县| 榕江县| 米泉市| 松潘县| 聂荣县| 翼城县| 巴彦淖尔市| 大同县| 海阳市| 嵊州市| 陵川县| 九龙城区| 许昌市| 陵水| 安达市| 隆尧县| 万全县| 翁源县| 临颍县| 沁水县| 赞皇县| 内黄县| 获嘉县| 内丘县| 周宁县| 保山市| 南昌市| 万全县| 长泰县| 大方县| 长丰县| 洛浦县| 元阳县| 泸定县| 福鼎市| 永和县|