python對XML的解析
常見的XML編程接口有DOM和SAX,這兩種接口處理XML文件的方式不同,當然使用場合也不同。
python有三種方法解析XML,SAX,DOM,以及ElementTree:
1.SAX (simple API for XML )
pyhton 標準庫包含SAX解析器,SAX用事件驅動模型,通過在解析XML的過程中觸發一個個的事件並調用用戶定義的回調函數來處理XML文件。
2.DOM(Document Object Model)
將XML數據在內存中解析成一個樹,通過對樹的操作來操作XML。
文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴展置標語言的標準編程接口。
一個 DOM 的解析器在解析一個 XML 文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構裏,之後你可以利用DOM 提供的不同的函數來讀取或修改文檔的內容和結構,也可以把修改過的內容寫入xml文件。
3.ElementTree(元素樹)
ElementTree就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內存少。
1.加載xml文件
加載XML文件共有2種方法,一是加載指定字符串,二是加載指定文件
2.獲取element的方法
a) 通過getiterator
b) 過 getchildren
c) find方法
d) findall方法
注:因DOM需要將XML數據映射到內存中的樹,一是比較慢,二是比較耗內存,而SAX流式讀取XML文件,比較快,佔用內存少,但需要用戶實現回調函數(handler)。
# coding: utf-8 # FileName: testXml.py # 方法一測試解析XML文件,採用xml.dom方式 import xml.dom.minidom xmlfile = r'E:\Program\python\testxml.xml' def TestXmlUseDom(): DOMTree = xml.dom.minidom.parse(xmlfile) # 獲取根節點 root = DOMTree.documentElement # 獲取屬性 if root.hasAttribute("shelf"): print "Root element: %s" % root.getAttribute("shelf") # 獲取子節點 movies = root.getElementsByTagName("movie") for move in movies: print "*****Movie******" if move.hasAttribute("Title"): print "Movie : %s", move.getAttribute("Title") # 節點的文本,data t = move.getElementsByTagName("type")[0] print "Type: %s" % t.childNodes[0].data f = move.getElementsByTagName("format")[0] print "format: %s" % f.childNodes[0].data TestXmlUseDom() # 方法二,使用ElementTree from xml.etree import ElementTree as ET def print_node(node): '''打印節點''' print "==========================" # 返回屬性是一個字典格式 print "node.attrib: %s" % node.attrib if node.attrib.has_key("title"): print "node.attrib['title']: %s" % node.attrib['title'] # tag 節點名稱 print "node.tag:%s" % node.tag # text 節點內容 print "node.text:%s" % node.text def TestXmlET(): print "TestXmlET" # 加載文件 root = ET.parse(xmlfile) # 從文本加載 # root = ET.fromstring(text) # 遍歷子節點 lst_node = root.getiterator("movie") for node in lst_node: print_node(node) # 獲取第一個節點movie print "first movie:" # 獲取所有子節點getchildren lst_node_child = lst_node[0].getchildren()[0] print_node(lst_node_child) print "find movie:" node_find = root.find("movie") print_node(node_find) # findall,查找所有的 node_findall = root.findall("movie")[1] print_node(node_findall) # 直接使用路徑查找 node_findone = root.find("movie/type") print_node(node_findone) # 直接使用路徑查找 node_findall2 = root.findall("movie/type") for node in node_findall2: print_node(node_findone) TestXmlET()