Python解析XML文件

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()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章