国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python存取XML的常見方法實例分析

2019-11-25 16:18:07
字體:
來源:轉載
供稿:網友

本文實例講述了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解析器的內存使用量完全根據輸入資料的大小(相對來說,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()

ElementTree

目前搜到的ElementTree的信息較少,目前不知道其工作機制。有資料顯示ElementTree近乎一種輕量級的DOM,但是ElementTree 所有的 Element 節點的工作方式是一致的。它很類似于C#中的XpathNavigator。

'''Created on 2012-5-25@author: salomon'''from xml.etree.ElementTree import ElementTreetree = 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:

就以上幾點來說Expat和SAX解析XML方式相同,就是不知道性能相比怎樣。DOM相對于以上兩種解析器,消耗內存,而且由于存取耗時,所以處理文件相對來說慢。如果文件太大無法載入內存,DOM這種解析器就不能用了,但是對于,某些種類的XML驗證需要存取整份文件,或者某些XML處理僅要求存取整份文件的需求時,DOM是唯一選擇。

Note:

需要指出的是存取XML的這幾項技術并不是Python獨創的,Python也是通過借鑒其他語言或者直接從其他語言引入進來的。例如Expat就是一個用C語言開發的、用來解析XML文檔的開發庫。而SAX最初是由DavidMegginson采用java語言開發的,DOM可以以一種獨立于平臺和語言的方式訪問和修改一個文檔的內容和結構。可以應用于任何編程語言。

做為對比我也想列舉一下C#存取XML文檔的方式:

1. 基于DOM的XmlDocument
2. 基于流文件的XmlReader 和 XmlWriter(它和SAX流文件實現不同,SAX是事件驅動模型)。
3. Linq to Xml

流文件兩種模型:XmlReader/XMLWriter VS SAX

流模型每次迭代XML文檔中的一個節點,適合于處理較大的文檔,所耗內存空間小。流模型中有兩種變體――“推”模型和“拉”模型。

推模型也就是常說的SAX,SAX是一種靠事件驅動的模型,也就是說:它每發現一個節點就用推模型引發一個事件,而我們必須編寫這些事件的處理程序,這樣的做法非常的不靈活,也很麻煩。

.NET中使用的是基于“拉”模型的實現方案,“拉”模型在遍歷文檔時會把感興趣的文檔部分從讀取器中拉出,不需要引發事件,允許我們以編程的方式訪問文檔,這大大的提高了靈活性,在性能上“拉”模型可以選擇性的處理節點,而SAX每發現一個節點都會通知客戶機,從而,使用“拉”模型可以提高Application的整體效率。

PS:這里再為大家提供幾款關于xml操作的在線工具供大家參考使用:

在線XML/JSON互相轉換工具:
http://tools.VeVB.COm/code/xmljson

在線格式化XML/在線壓縮XML
http://tools.VeVB.COm/code/xmlformat

XML在線壓縮/格式化工具:
http://tools.VeVB.COm/code/xml_format_compress

XML代碼在線格式化美化工具:
http://tools.VeVB.COm/code/xmlcodeformat

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python操作xml數據技巧總結》、《Python數據結構與算法教程》、《Python Socket編程技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》、《Python入門與進階經典教程》及《Python文件與目錄操作技巧匯總

希望本文所述對大家Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉水县| 石河子市| 无棣县| 清水河县| 方山县| 娱乐| 志丹县| 东阳市| 盈江县| 安泽县| 加查县| 巢湖市| 黄浦区| 邹城市| 大竹县| 曲沃县| 当雄县| 临湘市| 海安县| 太原市| 云龙县| 河北省| 慈溪市| 商洛市| 青岛市| 金平| 宁河县| 巴林左旗| 义乌市| 仙游县| 定兴县| 临汾市| 岳普湖县| 梁河县| 响水县| 简阳市| 文昌市| 剑河县| 合阳县| 来凤县| 邵阳县|