Python存取XML的常見方法實(shí)例分析
本文實(shí)例講述了Python存取XML的常見方法。分享給大家供大家參考,具體如下:
目前而言,Python 3.2存取XML有以下四種方法:
1.Expat
2.DOM
3.SAX
4.ElementTree
以以下xml作為討論依據(jù)
<?xml version="1.0" encoding="utf-8"?> <Schools> <School Name="XiDian"> <Class Id="030612"> <Student Name="salomon"> <Scores> <Math>98</Math> <English>85</English> <physics>89</physics> </Scores> </Student> <Student Name="Jupiter"> <Scores> <Math>74</Math> <English>83</English> <physics>69</physics> </Scores> </Student> </Class> <Class Id="030611"> <Student Name="Venus"> <Scores> <Math>98</Math> <English>85</English> <physics>89</physics> </Scores> </Student> <Student Name="Mars"> <Scores> <Math>74</Math> <English>83</English> <physics>69</physics> </Scores> </Student> </Class> </School> </Schools>
Expat
Expat是一個(gè)面向流的解析器。您注冊(cè)的解析器回調(diào)(或handler)功能,然后開始搜索它的文檔。當(dāng)解析器識(shí)別該文件的指定的位置,它會(huì)調(diào)用該部分相應(yīng)的處理程序(如果您已經(jīng)注冊(cè)的一個(gè))。該文件被輸送到解析器,會(huì)被分割成多個(gè)片斷,并分段裝到內(nèi)存中。因此expat可以解析那些巨大的文件。
SAX
SAX是個(gè)循序存取XML的解析器API,一個(gè)實(shí)現(xiàn)SAX的解析器(也就是“SAX Parser”)以一個(gè)串流解析器的型式作用,擁有事件驅(qū)動(dòng)API。由使用者定義回調(diào)函數(shù),解析時(shí),若發(fā)生事件的話會(huì)被調(diào)用。事件在任一XML特性遇到時(shí)引發(fā),以及遇到他們結(jié)尾時(shí)再次引發(fā)。XML屬性也作為傳給元素事件資料的一部分。SAX 處理時(shí)單方向性的;解析過(guò)的資料無(wú)法在不重新開始的情況下再次讀取。
DOM
DOM解析器在任何處理開始之前,必須把整棵樹放在內(nèi)存,所以DOM解析器的內(nèi)存使用量完全根據(jù)輸入資料的大?。ㄏ鄬?duì)來(lái)說(shuō),SAX解析器的內(nèi)存內(nèi)容,是只基于XML檔案的最大深度(XML樹的最大深度)和單一XML項(xiàng)目上XML屬性儲(chǔ)存的最大資料)。
DOM在python3.2中有兩種實(shí)現(xiàn)方式:
1.xml.minidom是一個(gè)基本的實(shí)現(xiàn)。
2.xml.pulldom只在需要時(shí)構(gòu)建被訪問(wèn)的子樹。
''' Created on 2012-5-25 @author: salomon ''' import xml.dom.minidom as minidom dom = minidom.parse("E:\\test.xml") root = dom.getElementsByTagName("Schools") #The function getElementsByTagName returns NodeList. print(root.length) for node in root: print("Root element is %s。" %node.tagName)# 格式化輸出,與C系列語(yǔ)言有很大區(qū)別。 schools = node.getElementsByTagName("School") for school in schools: print(school.nodeName) print(school.tagName) print(school.getAttribute("Name")) print(school.attributes["Name"].value) classes = school.getElementsByTagName("Class") print("There are %d classes in school %s" %(classes.length, school.getAttribute("Name"))) for mclass in classes: print(mclass.getAttribute("Id")) for student in mclass.getElementsByTagName("Student"): print(student.attributes["Name"].value) print(student.getElementsByTagName("English")[0].nodeValue) #這個(gè)為什么??? print(student.getElementsByTagName("English")[0].childNodes[0].nodeValue) student.getElementsByTagName("English")[0].childNodes[0].nodeValue = 75 f = open('new.xml', 'w', encoding = 'utf-8') dom.writexml(f,encoding = 'utf-8') f.close()
ElementTree
目前搜到的ElementTree的信息較少,目前不知道其工作機(jī)制。有資料顯示ElementTree近乎一種輕量級(jí)的DOM,但是ElementTree 所有的 Element 節(jié)點(diǎn)的工作方式是一致的。它很類似于C#中的XpathNavigator。
''' Created on 2012-5-25 @author: salomon ''' from xml.etree.ElementTree import ElementTree tree = ElementTree() tree.parse("E:\\test.xml") root = tree.getroot() print(root.tag) print(root[0].tag) print(root[0].attrib) schools = root.getchildren() for school in schools: print(school.get("Name")) classes = school.findall("Class") for mclass in classes: print(mclass.items()) print(mclass.keys()) print(mclass.attrib["Id"]) math = mclass.find("Student").find("Scores").find("Math") print(math.text) math.set("teacher", "bada") tree.write("new.xml")
Compare:
就以上幾點(diǎn)來(lái)說(shuō)Expat和SAX解析XML方式相同,就是不知道性能相比怎樣。DOM相對(duì)于以上兩種解析器,消耗內(nèi)存,而且由于存取耗時(shí),所以處理文件相對(duì)來(lái)說(shuō)慢。如果文件太大無(wú)法載入內(nèi)存,DOM這種解析器就不能用了,但是對(duì)于,某些種類的XML驗(yàn)證需要存取整份文件,或者某些XML處理僅要求存取整份文件的需求時(shí),DOM是唯一選擇。
Note:
需要指出的是存取XML的這幾項(xiàng)技術(shù)并不是Python獨(dú)創(chuàng)的,Python也是通過(guò)借鑒其他語(yǔ)言或者直接從其他語(yǔ)言引入進(jìn)來(lái)的。例如Expat就是一個(gè)用C語(yǔ)言開發(fā)的、用來(lái)解析XML文檔的開發(fā)庫(kù)。而SAX最初是由DavidMegginson采用java語(yǔ)言開發(fā)的,DOM可以以一種獨(dú)立于平臺(tái)和語(yǔ)言的方式訪問(wèn)和修改一個(gè)文檔的內(nèi)容和結(jié)構(gòu)??梢詰?yīng)用于任何編程語(yǔ)言。
做為對(duì)比我也想列舉一下C#存取XML文檔的方式:
1. 基于DOM的XmlDocument
2. 基于流文件的XmlReader 和 XmlWriter(它和SAX流文件實(shí)現(xiàn)不同,SAX是事件驅(qū)動(dòng)模型)。
3. Linq to Xml
流文件兩種模型:XmlReader/XMLWriter VS SAX
流模型每次迭代XML文檔中的一個(gè)節(jié)點(diǎn),適合于處理較大的文檔,所耗內(nèi)存空間小。流模型中有兩種變體——“推”模型和“拉”模型。
推模型也就是常說(shuō)的SAX,SAX是一種靠事件驅(qū)動(dòng)的模型,也就是說(shuō):它每發(fā)現(xiàn)一個(gè)節(jié)點(diǎn)就用推模型引發(fā)一個(gè)事件,而我們必須編寫這些事件的處理程序,這樣的做法非常的不靈活,也很麻煩。
.NET中使用的是基于“拉”模型的實(shí)現(xiàn)方案,“拉”模型在遍歷文檔時(shí)會(huì)把感興趣的文檔部分從讀取器中拉出,不需要引發(fā)事件,允許我們以編程的方式訪問(wèn)文檔,這大大的提高了靈活性,在性能上“拉”模型可以選擇性的處理節(jié)點(diǎn),而SAX每發(fā)現(xiàn)一個(gè)節(jié)點(diǎn)都會(huì)通知客戶機(jī),從而,使用“拉”模型可以提高Application的整體效率。
PS:這里再為大家提供幾款關(guān)于xml操作的在線工具供大家參考使用:
在線XML/JSON互相轉(zhuǎn)換工具:
http://tools.jb51.net/code/xmljson
在線格式化XML/在線壓縮XML:
http://tools.jb51.net/code/xmlformat
XML在線壓縮/格式化工具:
http://tools.jb51.net/code/xml_format_compress
XML代碼在線格式化美化工具:
http://tools.jb51.net/code/xmlcodeformat
更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python操作xml數(shù)據(jù)技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python一行代碼識(shí)別發(fā)票并保存Excel示例詳解
這篇文章主要為大家介紹了Python一行代碼識(shí)別發(fā)票并保存Excel示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Python學(xué)習(xí)筆記之視頻人臉檢測(cè)識(shí)別實(shí)例教程
這篇文章主要給大家介紹了關(guān)于Python學(xué)習(xí)筆記之視頻人臉檢測(cè)識(shí)別的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03手把手教你用Matplotlib實(shí)現(xiàn)數(shù)據(jù)可視化
Matplotlib是支持?Python語(yǔ)言的開源繪圖庫(kù),因?yàn)槠渲С重S富的繪圖類型、簡(jiǎn)單的繪圖方式以及完善的接口文檔,深受?Python?工程師、科研學(xué)者、數(shù)據(jù)工程師等各類人士的喜歡。本文將詳細(xì)為大家介紹如何用Matplotlib實(shí)現(xiàn)數(shù)據(jù)可視化,需要的可以參考一下2022-02-02基于python實(shí)現(xiàn)把圖片轉(zhuǎn)換成素描
這篇文章主要介紹了基于python實(shí)現(xiàn)把圖片轉(zhuǎn)換成素描,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址
這篇文章主要介紹了Python3.10動(dòng)態(tài)修改Windows系統(tǒng)本地IP地址,需要的朋友可以參考下2023-05-05jupyter notebook指定啟動(dòng)目錄的方法
這篇文章主要介紹了jupyter notebook指定啟動(dòng)目錄的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03