怎樣用Python處理XML文件?ElementTree解析

python處理xml方便因內(nèi)置xml.etree.elementtree模塊,其將xml文檔視為樹(shù)結(jié)構(gòu),每個(gè)節(jié)點(diǎn)為元素;讀取用et.parse()加載文件并獲取根節(jié)點(diǎn);遍歷通過(guò)循環(huán)子節(jié)點(diǎn)或find()/findall()查找特定節(jié)點(diǎn);修改內(nèi)容可直接賦值文本并用write()保存更改。

怎樣用Python處理XML文件?ElementTree解析

處理XML文件在python中其實(shí)挺方便的,尤其是用標(biāo)準(zhǔn)庫(kù)里的xml.etree.ElementTree模塊。它功能夠用、接口清晰,適合大多數(shù)常見(jiàn)的XML操作場(chǎng)景。

怎樣用Python處理XML文件?ElementTree解析

什么是ElementTree?

ElementTree是Python內(nèi)置的一個(gè)用于解析和生成XML數(shù)據(jù)的模塊。它把整個(gè)XML文檔看作一棵樹(shù),每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)元素(Element),通過(guò)遍歷這棵樹(shù)來(lái)訪(fǎng)問(wèn)或修改內(nèi)容。

怎樣用Python處理XML文件?ElementTree解析

比如你有下面這樣的XML結(jié)構(gòu):

立即學(xué)習(xí)Python免費(fèi)學(xué)習(xí)筆記(深入)”;

<data>     <country name="China">Beijing</country>     <country name="USA">Washington</country> </data>

你可以把它讀進(jìn)來(lái),然后一層層地找到你需要的數(shù)據(jù)。

怎樣用Python處理XML文件?ElementTree解析

如何讀取XML文件?

使用ElementTree.parse()方法可以加載一個(gè)XML文件。它返回一個(gè)樹(shù)對(duì)象,你可以從這個(gè)對(duì)象拿到根節(jié)點(diǎn),再往下找其他元素。

import xml.etree.ElementTree as ET  tree = ET.parse('countries.xml') root = tree.getroot()

這時(shí)候root就是標(biāo)簽對(duì)應(yīng)的節(jié)點(diǎn)。你可以直接打印它看看類(lèi)型或者標(biāo)簽名:

print(root.tag)  # 輸出:data

如果是字符串而不是文件的話(huà),可以用ET.fromstring()函數(shù)。

怎么遍歷XML節(jié)點(diǎn)?

拿到根節(jié)點(diǎn)之后,最常見(jiàn)的做法是循環(huán)遍歷它的子節(jié)點(diǎn):

for child in root:     print(child.tag, child.attrib)

上面這段代碼會(huì)輸出:

country {'name': 'China'} country {'name': 'USA'}

如果你想更靈活地查找特定節(jié)點(diǎn),可以用find()或findall()方法:

  • find() 返回第一個(gè)匹配的子節(jié)點(diǎn)
  • findall() 返回所有匹配的子節(jié)點(diǎn)列表

例如:

china = root.find(".//country[@name='China']") print(china.text)  # 輸出:Beijing

XPath語(yǔ)法在這里很實(shí)用,像.//country[@name=’China’]這種寫(xiě)法能快速定位目標(biāo)節(jié)點(diǎn)。

修改和保存XML內(nèi)容怎么做?

有時(shí)候你不僅想讀,還想改內(nèi)容甚至新增節(jié)點(diǎn)。

比如修改某個(gè)節(jié)點(diǎn)的文本內(nèi)容:

usa = root.find(".//country[@name='USA']") usa.text = "DC"

也可以添加新節(jié)點(diǎn):

new_country = ET.SubElement(root, 'country', name='Japan') new_country.text = 'Tokyo'

最后別忘了保存改動(dòng):

tree.write('countries.xml')

這樣就能把修改后的結(jié)構(gòu)寫(xiě)回原文件了。

不過(guò)要注意的是,寫(xiě)入時(shí)默認(rèn)不會(huì)自動(dòng)格式化縮進(jìn)。如果你希望結(jié)果好看點(diǎn),可以在寫(xiě)入前手動(dòng)加一些換行和tab字符,或者用第三方工具美化輸出。

基本上就這些。用ElementTree處理XML不算難,但有些細(xì)節(jié)容易忽略,比如屬性要用字典方式訪(fǎng)問(wèn),路徑查找要記得語(yǔ)法格式等。熟練之后你會(huì)發(fā)現(xiàn)它非常順手。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享