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()保存更改。
處理XML文件在python中其實(shí)挺方便的,尤其是用標(biāo)準(zhǔn)庫(kù)里的xml.etree.ElementTree模塊。它功能夠用、接口清晰,適合大多數(shù)常見(jiàn)的XML操作場(chǎng)景。
什么是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)容。
比如你有下面這樣的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ù)。
如何讀取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)它非常順手。