本文實例講述了Python存取XML的常見方法。分享給大家供大家參考,具體如下:
目前而言,Python 3.2存取XML有以下四種方法:
1.Expat
2.DOM
3.SAX
4.ElementTree
以以下xml作為討論依據
<?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是一個面向流的解析器。您注冊的解析器回調(或handler)功能,然后開始搜索它的文檔。當解析器識別該文件的指定的位置,它會調用該部分相應的處理程序(如果您已經注冊的一個)。該文件被輸送到解析器,會被分割成多個片斷,并分段裝到內存中。因此expat可以解析那些巨大的文件。
SAX
SAX是個循序存取XML的解析器API,一個實現SAX的解析器(也就是“SAX Parser”)以一個串流解析器的型式作用,擁有事件驅動API。由使用者定義回調函數,解析時,若發生事件的話會被調用。事件在任一XML特性遇到時引發,以及遇到他們結尾時再次引發。XML屬性也作為傳給元素事件資料的一部分。SAX 處理時單方向性的;解析過的資料無法在不重新開始的情況下再次讀取。
DOM
DOM解析器在任何處理開始之前,必須把整棵樹放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大?。ㄏ鄬碚f,SAX解析器的內存內容,是只基于XML檔案的最大深度(XML樹的最大深度)和單一XML項目上XML屬性儲存的最大資料)。
DOM在python3.2中有兩種實現方式:
1.xml.minidom是一個基本的實現。
2.xml.pulldom只在需要時構建被訪問的子樹。
'''Created on 2012-5-25@author: salomon'''import xml.dom.minidom as minidomdom = 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系列語言有很大區別。 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) #這個為什么?。? print(student.getElementsByTagName("English")[0].childNodes[0].nodeValue) student.getElementsByTagName("English")[0].childNodes[0].nodeValue = 75f = open('new.xml', 'w', encoding = 'utf-8')dom.writexml(f,encoding = 'utf-8')f.close()
新聞熱點
疑難解答