dom方式在解析xml資料時是將整個文件樹載入到記憶體中,因此在解析大型一點的xml資料時沒什麼優勢,這個時候可以考慮使用sax的方式解析
首先要實現自己的xml.sax.handler.contenthandler內容處理者類
主要是過載以下方法:
def __init__(self):
xml.sax.handler.contenthandler.__init(self)#初始化方法
def startdocument(self):#開始解析文件
print("start handler document")
def enddocument(self):#結束解析文件
print("end handler document")
def startelement(self,name,attrs):#開始解析節點
print(name,attrs)
def endelement(self,name):#結束解析節點
print("end element",name)
def characters(self,content):#解析內容
print("content",content)
其中attrs是節點中的屬性型別是:xml.sax.xmlreader.attributesimpl
可以通過attrs.getlength()或者attrs.__len__()>0來判斷是否還有屬性
attrs.getnames()返回乙個含有屬性名的list 然後可以根據屬性名取得型別,值
for _,attrname in enumerate(attrs):
attrs.getvalue(attrname )
class xmlcontenthandler(xml.sax.handler.contenthandler):
def __init__(self):
xml.sax.handler.contenthandler.__init__(self)
def startdocument(self):
print("start handler documtnet")
def enddocument(self):
print("end handler document")
def startelement(self,name,attrs):
print("當前處理節點:",name)
if attrs.__len__() > 0:#attrs.getlength()>0
for _,attr in enumerate(attrs.getnames()):
print(name,"節點屬性",attr,attrs.getvalue(attr))
else:
print(name,"節點不包含屬性")
def endelement(self,name):
print("當前處理節點:",name,"處理完")
def characters(self,content):
content =content.strip().replace("\n","").replace("\r","")
if "" != content:
print("節點內容",content)
saxparser = xml.sax.make_parser()
handler = xmlcontenthandler()
saxparser.setcontenthandler(handler)
saxparser.parse("text.xml")
測試結果:
python sax流式解析xml檔案例項
注 摘出解析xml兩個關鍵函式 import xml.sax import xml.sax.handler class saxhandler xml.sax.contenthandler def init self self.tag none self.attribute defstarteleme...
IOS內建NSXMLParser解析xml
nsxmlparser解析xml格式的資料 用法如下 首先,nsxmlparser必須繼續nsxmlparserdelegate協議 inte ce xmlhelper nsobject 首先設定xml資料,並初始化nsxmlparser void viewdidload 遍例xml的節點 void...
使用原生的NSXmlParser解析xml資料
下面是本人使用原聲nsxmlparser對xml資料進行的解析。這裡有篇有一篇很不錯的教程,使用gdataxml庫對xml資料進行的解析,而且還有對xml資料格式的組建,講解的很是詳細。import viewcontroller.h pragma mark xml解析器 xml資料解析器 inte ...