Python XML解析之SAX

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)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值