Python XML解析之SAX

来源:互联网 发布:java replaceall \\s 编辑:程序博客网 时间:2024/05/02 04:22

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模块和personimport xml.saxfrom person import personclass 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.telpeople=[]#创建一个空的元组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)