SAX,全称Simple API for XML,既是一种接口,也是一种软件包。它是一种XML解析的替代方法。SAX不同于DOM解析,它逐行扫描文档,一边扫描一边解析。由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势。
用sax解析xml需要继承ContentHandler,引入xml.sax中的parse函数 ContentHandler常用的方法:
1.startDocument()方法,文档启动的时候调用。
2.endDocument()方法,解析器到达文档结尾时调用。
3.startElement(name, attrs)方法,遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值。
4.endElement(name)方法,遇到XML结束标签时调用,name是标签的名字。
5.characters(content)方法,读取标签文本内容,content是文本内容 解析people.xml文档:
<?xml version="1.0" encoding="utf-8" ?> <people> <person id="1"> <name>张三</name> <age>18</age> <tel>1552644646446</tel> </person> <person id="2"> <name>李四</name> <age>16</age> <tel>12599897</tel> </person> <person id="3"> <name>王五</name> <age>17</age> <tel>21245478956</tel> </person> </people>还需要一个person.py,把数据封装到person中
class person: name=None age=None tel=None def __init__(self,name=None,age=None,tel=None): self.name=name self.age=age self.tel=tel def __repr__(self): return "{0:20}{1:<5}{2:15}".format(self.name,self.age,self.tel)以下是用sax解析xml的代码:
#导入sax模块和person import xml.sax from person import person class MyHandler(xml.sax.ContentHandler):#继承ContentHandler #初始化 def __init__(self): self.person=None self.tag=None #文件开始读 def startElement(self,name,attrs):#name是标签名字,attrs是标签的属性值 self.tag=name if name == 'person': self.person=person()#如果标签名字是person,调用person()赋给self.person #文件结束读 def endElement(self,name):#name是标签名字 if name == 'person': global people#调用外部全局标量 people.append(self.person)#如果标签名字是person,把解析完的数据加入到people的元组中 self.person=None self.tag=None #读取标签中的文本内容 def characters(self,content):#content代表文本内容 if 'name'==self.tag: self.person.name = content#如果标签名字等于name,就把name中的文本内容赋给self.person.name if 'age'==self.tag: self.person.age = int(content)#如果标签名字等于age,就把age中的文本内容赋给self.person.age,并强制转换成int类型 if 'tel'==self.tag: self.person.tel = content#如果标签名字等于tel,就把tel中的文本内容赋给self.person.tel people=[]#创建一个空的元组 parse=xml.sax.make_parser()#创建一个新的解析器对象并返回 print(parse) #关闭命名空间 #parse.setFeature(xml.sax.handler.feature_namespaces,0) parse.setContentHandler(MyHandler())#重写MyHandler()方法 parse.parse("people.xml")#加载xml文档 for i in people:#通过for循环people元组,遍历xml中的文本内容 print(i)