最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年03月21日 12:21:41   作者:salomon  
這篇文章主要介紹了Python存取XML的常見方法,結(jié)合具體實例形式較為詳細的分析了Python存取xml的常用方法、優(yōu)缺點比較與相關(guān)注意事項,需要的朋友可以參考下

本文實例講述了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是一個面向流的解析器。您注冊的解析器回調(diào)(或handler)功能,然后開始搜索它的文檔。當(dāng)解析器識別該文件的指定的位置,它會調(diào)用該部分相應(yīng)的處理程序(如果您已經(jīng)注冊的一個)。該文件被輸送到解析器,會被分割成多個片斷,并分段裝到內(nèi)存中。因此expat可以解析那些巨大的文件。

SAX

SAX是個循序存取XML的解析器API,一個實現(xiàn)SAX的解析器(也就是“SAX Parser”)以一個串流解析器的型式作用,擁有事件驅(qū)動API。由使用者定義回調(diào)函數(shù),解析時,若發(fā)生事件的話會被調(diào)用。事件在任一XML特性遇到時引發(fā),以及遇到他們結(jié)尾時再次引發(fā)。XML屬性也作為傳給元素事件資料的一部分。SAX 處理時單方向性的;解析過的資料無法在不重新開始的情況下再次讀取。

DOM

DOM解析器在任何處理開始之前,必須把整棵樹放在內(nèi)存,所以DOM解析器的內(nèi)存使用量完全根據(jù)輸入資料的大?。ㄏ鄬碚f,SAX解析器的內(nèi)存內(nèi)容,是只基于XML檔案的最大深度(XML樹的最大深度)和單一XML項目上XML屬性儲存的最大資料)。

DOM在python3.2中有兩種實現(xiàn)方式:

1.xml.minidom是一個基本的實現(xiàn)。
2.xml.pulldom只在需要時構(gòu)建被訪問的子樹。

'''
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系列語言有很大區(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) #這個為什么啊?
        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的信息較少,目前不知道其工作機制。有資料顯示ElementTree近乎一種輕量級的DOM,但是ElementTree 所有的 Element 節(jié)點的工作方式是一致的。它很類似于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:

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

Note:

需要指出的是存取XML的這幾項技術(shù)并不是Python獨創(chuàng)的,Python也是通過借鑒其他語言或者直接從其他語言引入進來的。例如Expat就是一個用C語言開發(fā)的、用來解析XML文檔的開發(fā)庫。而SAX最初是由DavidMegginson采用java語言開發(fā)的,DOM可以以一種獨立于平臺和語言的方式訪問和修改一個文檔的內(nèi)容和結(jié)構(gòu)??梢詰?yīng)用于任何編程語言。

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

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

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

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

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

.NET中使用的是基于“拉”模型的實現(xiàn)方案,“拉”模型在遍歷文檔時會把感興趣的文檔部分從讀取器中拉出,不需要引發(fā)事件,允許我們以編程的方式訪問文檔,這大大的提高了靈活性,在性能上“拉”模型可以選擇性的處理節(jié)點,而SAX每發(fā)現(xiàn)一個節(jié)點都會通知客戶機,從而,使用“拉”模型可以提高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īng)典教程》及《Python文件與目錄操作技巧匯總

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

相關(guān)文章

  • python對html過濾處理的方法

    python對html過濾處理的方法

    今天小編就為大家分享一篇python對html過濾處理的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • django模板語法學(xué)習(xí)之include示例詳解

    django模板語法學(xué)習(xí)之include示例詳解

    寫過 Web 程序的都對 include 包含文件很熟悉,那么在 Django,include 又是怎么一個機制呢?下面這篇文章主要給大家介紹了關(guān)于django模板語法學(xué)習(xí)之include的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • python 批量修改 labelImg 生成的xml文件的方法

    python 批量修改 labelImg 生成的xml文件的方法

    這篇文章主要介紹了python 批量修改 labelImg 生成的xml文件的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Matplotlib可視化之添加讓統(tǒng)計圖變得簡單易懂的注釋

    Matplotlib可視化之添加讓統(tǒng)計圖變得簡單易懂的注釋

    今天給大家?guī)淼奈恼率顷P(guān)于Python的,文章圍繞著Python Matplotlib可視化展開,文中非常詳細的介紹了如何給統(tǒng)計圖添加注釋,需要的朋友可以參考下
    2021-06-06
  • 使用Python實現(xiàn)一個簡單的文件搜索引擎

    使用Python實現(xiàn)一個簡單的文件搜索引擎

    這篇文章主要為大家詳細介紹了Python中文件操作的基礎(chǔ)和進階知識并基于以上知識實現(xiàn)了一個簡單的文件搜索引擎,感興趣的小伙伴可以參考一下
    2024-05-05
  • Python 制作自動化翻譯工具

    Python 制作自動化翻譯工具

    這篇文章主要介紹了Python 實現(xiàn)自動化翻譯和替換的腳本,幫助大家更好的理解和學(xué)習(xí)使用python,提高辦公效率感興趣的朋友可以了解下
    2021-04-04
  • python 對字典按照value進行排序的方法

    python 對字典按照value進行排序的方法

    這篇文章主要介紹了python 對字典按照value進行排序的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 怎么用Python識別手勢數(shù)字

    怎么用Python識別手勢數(shù)字

    今天給大家?guī)淼奈恼率窃趺从肞ython識別手勢數(shù)字,文中有非常詳細的圖文示例,對正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06
  • Python通過future處理并發(fā)問題

    Python通過future處理并發(fā)問題

    這篇文章主要介紹了Python通過future處理并發(fā)問題,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • 基于pytorch中的Sequential用法說明

    基于pytorch中的Sequential用法說明

    這篇文章主要介紹了基于pytorch中的Sequential用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論

株洲县| 襄城县| 新乡市| 长沙市| 永寿县| 屯门区| 洱源县| 星座| 鄢陵县| 本溪市| 昌图县| 福州市| 揭西县| 巧家县| 加查县| 堆龙德庆县| 田林县| 荆门市| 宁德市| 铁岭市| 怀柔区| 措勤县| 绥德县| 增城市| 哈尔滨市| 利川市| 河北省| 财经| 三亚市| 柳河县| 刚察县| 石景山区| 和林格尔县| 潼关县| 山东省| 卢湾区| 旬阳县| 东阳市| 永仁县| 乾安县| 眉山市|