Python XML解析之SAX
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)