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")
效果: