Python之SAX解析XML

SAX 是一种基于事件驱动的API。
利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器
解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

1、对大型文件进行处理;
2、只需要文件的部分内容,或者只需从文件中得到特定信息。
3、想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍

characters(content) 方法
调用时机:
从行开始,遇到标签之前,存在字符,content 的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument() 方法
文档启动的时候调用。
endDocument() 方法
解析器到达文档结尾时调用。
startElement(name, attrs) 方法
遇到XML开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
endElement(name) 方法
遇到XML结束标签时调用。
make_parser 方法
以下方法创建一个新的解析器对象并返回。
xml.sax.make_parser( [parser_list] )
参数说明:

parser_list - 可选参数,解析器列表

parser 方法
以下方法创建一个 SAX 解析器并解析xml文档:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
参数说明:

xmlfile - xml文件名
contenthandler - 必须是一个 ContentHandler 的对象
errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

parseString 方法
parseString 方法创建一个 XML 解析器并解析 xml 字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
参数说明:

xmlstring - xml字符串
contenthandler - 必须是一个 ContentHandler 的对象
errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler对象

将XML文件解析成对象并输出

import xml.sax
import os
import time
obj = {}

#创建、写入文件
def nsfile(s):
    #判断文件夹是否存在,如果不存在则创建
    b = os.path.exists("C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\")
    if b:
        print("File Exist!")
    else:
        os.mkdir("C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\")
    #生成文件
    localTime = time.strftime("%Y%m%d%H%M%S",time.localtime())
    #print localtime
    filename = "C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\"+localTime+".txt"
    #a:以追加模式打开(必要时可以创建)
    f = open(filename,'a')
    #文件写入
    f.write(s)
    f.close()
    print("ALL Down")
    time.sleep(1)

class aaaHandler(xml.sax.ContentHandler):
	def __init__(self):
		self.CurrentData = ""
	#元素开始调用
	def startElement(self,tag,attributes):
		print(tag)
		print(self.CurrentData)
	#元素结束调用
	def endElement(self,tag):
		#tag:节点名称   self.CurrentData:节点值
		if self.CurrentData == tag:
			self.CurrentData = ''
		obj[tag.lower()] = self.CurrentData

	#读取字符时调用
	def characters(self,content):
		self.CurrentData = content

	#解析到文档结尾时调用
	def endDocument(self):
		nsfile(str(obj))
if (__name__ == "__main__"):
	#创建一个XMLReader
	parser = xml.sax.make_parser()
	#关闭命名空间
	parser.setFeature(xml.sax.handler.feature_namespaces,0)

	#重写ContextHandler
	Handler = aaaHandler()
	parser.setContentHandler(Handler)
	parser.parse("aaa.xml")

效果:
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值