python有一些內建的xml解析庫,本文介紹python中的expat庫
expat的特點之一就是支援動態解析xml。何為動態?就是某個xml串並不需要全部輸入給expat,哪怕只是一部分,expat也能感應到響應的事件。事件?比如檢測到新元素出現(實質上是expat遇到了‘<’),或者檢測到某個元素處理完畢(遇到了‘/>’)。所以——expat不一定需要完整的xml就能工作。
看程式
1 import xml.parsers.expat 2 3 class ExParser(object): 4 '''Parse roster xml''' 5 def __init__(self, xml_raw): 6 '''init parser and setup handlers''' 7 self.parser = xml.parsers.expat.ParserCreate() 8 9 #connect handlers10 self.parser.StartElementHandler = self.start_element11 self.parser.EndElementHandler = self.end_element12 self.parser.CharacterDataHandler = self.char_data13 self.parser.Parse(xml_raw)14 del(xml_raw)15 16 def start_element(self, name, attrs):17 '''Start xml element handler'''18 print 'start:'+name19 20 def end_element(self, name):21 '''End xml element handler'''22 print 'end:'+name23 24 def char_data(self, data):25 '''Char xml element handler'''26 print 'data is '+data
啊分析:
7行 ExParser的構造中定義了一個expat解析器
10-12行 為解析器設定感興趣的回呼函數
13行 開始解析我們的xml
然後就是等待expat解析,一旦expat解析器遇到xml的 元素開始,元素結束,元素值 事件時,會回分別調用start_element, end_element, char_data函數
16行 參數name,attrs 分別代表節點名稱,節點屬性(字典)
20行 參數name代表節點名稱
24行 參數data代表節點資料
拿到這些值後,能做什麼都可以了。
尤其當我們遇到大塊xml資料的時候,可以利用expat動態解析這一點來分塊解析一個大塊。