python之XML文件解析


python對XML的解析

常見的XML編程接口有DOM和SAX,這兩種接口處理XML文件的方式不同,當然使用場合也不同。

python有三種方法解析XML,分別是SAX,DOM,以及ElementTree三種方法。

以下案例依次介紹三種方法:

  先寫一個關於book的xml文件

<books>
    <book id="01">
        <bookname>python入門</bookname>
        <author>李強</author>
        <price>25</price>
    </book>
    <book id="02">
        <bookname>java基礎</bookname>
        <author>王洋</author>
        <price>30</price>
    </book>
    <book id="03">
        <bookname>神雕俠侶</bookname>
        <author>金庸</author>
        <price>212</price>
    </book>

</books>

 

 

1.DOM(Document Object Model)

將XML數據在內存中解析成一個樹,通過對樹的操作來操作XML。

操作代碼如下:

#引入parse的包
from xml.dom.minidom import parse

doc=parse("book.xml")                   #先把xml文件加載進來
root=doc.documentElement                #獲取元素的根節點
books=root.getElementsByTagName('book') #找到子節點,得到的是一個數組

for book in books:                       #把所有的子節點進行遍歷
    print("===book====")
    if book.hasAttribute('id'):             #如果有ID屬性,則輸出
        print('書的ID是:%s'% book.getAttribute('id'))

    bookname=book.getElementsByTagName("bookname")[0]  #根據標簽名找到,並且輸出第一個元素
    print("書名是:%s"%bookname.childNodes[0].data)      #輸出標簽名的子節點的第一個值,並轉為data類型
    author=book.getElementsByTagName("author")[0]
    print("作者是:%s"%author.childNodes[0].data)
    price=book.getElementsByTagName("price")[0]
    print("價格是:%s"%price.childNodes[0].data)

 

2.SAX (simple API for XML )

python 標准庫包含SAX解析器,SAX用事件驅動模型,通過在解析XML的過程中觸發一個個的事件並調用用戶定義的回調函數來處理XML文件。

 

from xml.sax import parse, ContentHandler #引入繼承包ContentHandler


#書的類
class Book:
    #定義初始化屬性,和xml文件屬性相同
    def __init__(self,bookname=None,author=None,price=None):
        self.bookname=bookname
        self.author=author
        self.price=price
    def __str__(self):  #轉化為字符串輸出
        return self.bookname+","+self.author+","+self.price

books=[]#定義一個書的數組,用來存放每次得到的數據

#定義繼承ContentHandler的類,可以實現相應的方法
class bkdemo(ContentHandler):
    def __init__(self):
        #定義全局變量
        self.book=None #用來接收book的相應數據
        self.tag=None  #用來接收characters方法得到的content內容
    def startDocument(self): #books對象開始
        print("對象開始")
    def endDocument(self):  #books對象結束
        print("對象結束")
    def startElement(self, name, attrs): #每一個標簽元素的開始,name:標簽名稱 attrs:標簽內部相應屬性
        if name=='book':  #如果標簽名是book
            self.book=Book()  #創建一個Book()對象
    def endElement(self, name):  #每一個標簽元素的結束,name:標簽名稱 (此時才會得到相應的content)
        if name=='bookname':
            self.book.bookname=self.tag  #對象的標簽名=得到相應content的值
        if name=='author':
            self.book.author=self.tag
        if name=='price':
            self.book.price=self.tag
        if name=='book':
            books.append(self.book)  #為定義的數組追加得到的相應元素

    def characters(self, content):
        self.tag=content   #寫了self的,就可以定義為全局變量


parse("book.xml",bkdemo())  #parse的方法,分別指明xml文件,並調用查找的類方法
for i in books:   #對數組books[]循環
    print(i)

 

3.ElementTree(元素樹)

ElementTree就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內存少。

from xml.etree import ElementTree  #引入ElementTree的包
#書的類
class Book:
    #定義初始化屬性,和xml文件屬性相同
    def __init__(self,bookname=None,author=None,price=None):
        self.bookname=bookname
        self.author=author
        self.price=price
    def __str__(self):  #轉化為字符串輸出
        return self.bookname+","+self.author+","+self.price

roota=ElementTree.parse("book.xml") #parse方法讀取xml文件,得到元素樹
bk=roota.findall("book")  #findall查詢所有的book標簽
boo=[]   #定義一個集合
for aa in bk:   #對得到的所有的根元素下的子標簽循環輸出
    book=Book()   #定義一個類對象
    book.bookname=aa.find("bookname").text #對象的相應標簽值=子標簽查找到的固定標簽名,並以text形式輸出
    book.author=aa.find("author").text
    book.price=aa.find("price").text
    boo.append(book)  #將得到的屬性值追加到定義的集合中

for i in boo:  #遍歷集合
    print(i)

輸出結果:

python入門,李強,25
java基礎,王洋,30
神雕俠侶,金庸,212

Process finished with exit code 0

 

 

注:因DOM需要將XML數據映射到內存中的樹,一是比較慢,二是比較耗內存,而SAX流式讀取XML文件,比較快,占用內存少,但需要用戶實現回調函數(handler)。

本章節使用到的 XML 實例文件 movies.xml 內容如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM