1. 程式人生 > >Python中xml解析

Python中xml解析

XML指可擴充套件標記語言(extensibleMarkup Language),被設計用來傳輸和儲存資料

python有3種方法解析XML:SAX,DOM以及ElemenTree

1、SAX(simple API for XML)

python標準庫包含SAX解析器,SAX用事件驅動模型,通過在解析XML的過程中觸發事件並呼叫使用者定義的回撥函式來處理XML檔案

2、DOM(Document object Model)

將XML資料在記憶體中解析成一棵樹,通過對樹的操作來操作XML

3、elementTree解析

一、SAX解析XML

# SAX是一種基於事件驅動的API

# 兩個部分:解析器和事件處理器

# 解析器負責讀取XML文件,並向事件處理器傳送事件,如:元素開始跟元素結束事件

# 事件處理器:負責對事件作出響應,對傳遞的XML資料進行處理

# 對大型檔案進行處理

# 只需要檔案的部分內容,或者只需從檔案中得到特定資訊

# 想建立自己的物件模型的時候適合用

在python中使用sax方式處理xml:

先引入xml.sax中的parse函式、xml.sax.handler中的ContentHandler

1、  ContentHandler類方法

2、characters(content)方法

呼叫時機:從行開始,遇到標籤之前,存在字元,content的值為這些字串

從一個標籤,遇到下一個標籤之前,存在字元,content的值為這些字串

從一個標籤,遇到行結束符之前,存在字元,content的值為這些字串

標籤可以是開始標籤,也可以是結束標籤

3、startDocument()方法

文件啟動的時候呼叫

4、endDocument()方法:解析器到達文件結尾時呼叫

5、startElement(name,attrs)方法:

遇到XML開始標籤時呼叫,name是標籤的名字,attrs是標籤的屬性值字典

6、endElement(name)方法:遇到XML結束標籤時呼叫

7、make_parser方法:建立一個新的解析器物件並返回xml.sax.make_parser([parser_list])。parser_list————可選引數————解析器列表

8、parser方法:建立SAX解析器並解析xml文件,

   xml.sax.parse(xmlfile,contenthandler[,errorhandler])

       xmlfile - xml檔名

       contenthandler - 必須是一個ContentHandler的物件

        errorhandler - 如果指定該引數,errorhandler必須是一個SAXErrorHandler物件 '''

9、parseString方法:建立一個XML解析器並解析xml字串

   xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

       xmlstring - xml字串

       contenthandler - 必須是一個ContentHandler的物件

       errorhandler - 如果指定該引數,errorhandler必須是一個SAXErrorHandler物件

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): #
       
print("物件開始")
   
def endDocument(self):  #
       
print("物件結束")
   
def startElement(self, name, attrs):#
       
if name=='book'#
           
self.book=Book() 
    def endElement(self, name): 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("books.xml",bkdemo())  #parse的方法,分別指明xml檔案,並呼叫查詢的類方法
for i in books:  print(i)

二、xml.dom解析xml

# 檔案物件模型(DocumentObject Model,簡稱DOM),是W3C組織推薦的處理可擴充套件置標語言的標準程式設計介面。

# DOM 解析器在解析一個 XML 文件時,一次性讀取整個文件,把文件中所有元素儲存在記憶體中的一個樹結構裡,

# 之後利用DOM 提供的不同的函式來讀取或修改文件的內容和結構,也可以把修改過的內容寫入xml檔案。

from xml.dom.minidom import parse
import xml.dom.minidom

 # 使用minidom解析器開啟 XML 文件
#引入parse的包
from xml.dom.minidom import parse

doc=parse("books.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)


# 使用minidom解析器開啟 XML 文件
DOMTree = xml.dom.minidom.parse("books.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
    print ("Root element : %s" % collection.getAttribute("shelf"))

#在集合中獲取所有book
books = collection.getElementsByTagName("book")
#列印每本書的詳細資訊
for book in books:
    print('**************book****************')
    if book.hasAttribute("id"):
        print("id:%s"%book.getAttribute("id"))

    bookname = book.getElementsByTagName("bookname")[0]
    print("bookname:%s"%bookname.childNodes[0].data)
    author = book.getElementsByTagName('author')[0]
    print("author:%s"%author.childNodes[0].data)
    price = book.getElementsByTagName("price")[0]
    print("price:%s"%price.childNodes[0].data)

三、elementTree解析xml

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("books.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)