深度解讀Python示例說明
Python能夠簡單而有效地實(shí)現(xiàn)面向?qū)ο缶幊?,特別適用于快速應(yīng)用程序開發(fā),也可以用來開發(fā)大規(guī)模的重要的商業(yè)應(yīng)用。Python是一個理想的腳本語言,所以深受開發(fā)人員的大力支持,下面對Python示例進(jìn)行解說。
測試結(jié)果表明, REXML xml.minidom樣消耗量資源:解析 Hamlet.xml 10 秒,占 14 MB 存;解析 Weblog.xml 190 秒,占 150 MB 存。顯然,編程語言選擇通常優(yōu)先于庫比較。。
ElementTree 個優(yōu)點(diǎn)于能夠被循環(huán)運(yùn)行。這指,您以讀入個 XML 實(shí)例,修改數(shù)據(jù)結(jié)構(gòu)使非常類似于本機(jī)風(fēng)格,然調(diào) .write() 進(jìn)行重新序列化得格式良好 XML。當(dāng)然,DOM 能做這點(diǎn),但 gnosis.xml.objectify不行。#t#
gnosis.xml.objectify構(gòu)造個定制輸出函數(shù)于生成 XML 不 那么困難 - 但這不能自動進(jìn)行。使 ElementTree 以及 ElementTree 實(shí)例 .write() ,通過便利函數(shù) elementtree.ElementTree.dump() 以序列化單獨(dú) Element 實(shí)例。這讓您以從單獨(dú)象節(jié)點(diǎn) - 其包括 XML 實(shí)例根節(jié)點(diǎn) - 編 XML 片段。
提出個簡單任務(wù)比較 ElementTree gnosis.xml.objectify API。于基準(zhǔn)測試型文檔 weblog.xml 包含約 8,500 個 <entry> 元素,每個元素都含有相同子字段集合 - 這個面向數(shù)據(jù) XML 文檔典型布局。
處理該文時,任務(wù)能從每個 entry 收集些字段,但這只其某些字段有特定值(或范圍,或匹配部分容)。當(dāng)然,如果您確實(shí)只想運(yùn)行這個任務(wù)。使個流 API(如 SAX)以避免存整個文檔建模 - 但這里假定該任務(wù)應(yīng)程序型數(shù)據(jù)結(jié)構(gòu)運(yùn)行任務(wù)。個 <entry> 元素能像這樣:
- from elementtree
- import ElementTree
- weblog = ElementTree.parse(
- 'weblog.xml').getroot()
- interesting = [entry
- for entry
- in weblog.findall(
- 'entry')
- if entry.find(
- 'host').text==
- '209.202.148.31'
- and
- entry.find(
- 'statusCode').text==
- '200']
- for e
- in interesting:
注意面不同處。 Python子元素節(jié)點(diǎn)直接作節(jié)點(diǎn)屬性進(jìn)行連接(每個節(jié)點(diǎn)都個根據(jù)標(biāo)記名命名定制類)。另方面, ElementTree 使 Element 類查找子節(jié)點(diǎn)。 .findall() 返回所有匹配節(jié)點(diǎn)列表; .find() 則僅返回***匹配節(jié)點(diǎn);
返回節(jié)點(diǎn)文本容。如果您只想 gnosis.xml.objectify 子元素***匹配,只其建立索引即 - 例如, node.tag[0] 。但如果這樣子元素只有個,那么無需建立顯式索引,您以引用。
但 Python示例,其實(shí)您并不 需顯式查找所有 <entry> 元素;迭代時 Element 實(shí)例行方式類似于列表。這里注意點(diǎn),不管子節(jié)點(diǎn)有何標(biāo)記, 所有子節(jié)點(diǎn)都進(jìn)行迭代。相比, gnosis.xml.objectify 節(jié)點(diǎn)沒有置遍歷所有子元素。盡管如此,構(gòu)造個行 children() 函數(shù)還挺簡單(發(fā)行版包含該函數(shù))。