您的位置:首页 > 编程语言 > Python开发

python sax方式解析xml

2014-04-27 22:05 483 查看
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")
测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: