python之XML文件解析
- 2019 年 12 月 10 日
- 筆記
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