python sax方式解析xml

来源:互联网 发布:hexdump windows 编辑:程序博客网 时间:2024/05/02 00:15

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()>0for _,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")
测试结果:

0 0
原创粉丝点击