Python-XML 解析 2

Sax 解析器

代码

#!/usr/bin/env Python3
# -*- coding: utf-8 -*-
# @Software: PyCharm
# @virtualenv:workon
# @contact: contact information
# @Desc:xml的Sax解析器
__age__ = '未昔/AngelFate'
__date__ = '2019/8/22 20:14'
from xml.sax import parse, ContentHandler #引入继承包ContentHandler

# SAX (simple API for XML )
# python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

#学生的类
class Student:
 #定义初始化属性,和xml文件属性相同
 def __init__(self,studentname=None,age=None,class_=None):
 self.studentname=studentname # 姓名
 self.age=age # 年龄
 self.class_=class_ # 班级
 def __str__(self): #转化为字符串输出
 return self.studentname+","+self.age+","+self.class_

students=[]#定义一个书的数组,用来存放每次得到的数据

#定义继承ContentHandler的类,可以实现相应的方法
class STdemo(ContentHandler):
 def __init__(self):
 #定义全局变量
 self.student=None #用来接收student的相应数据
 self.tag=None #用来接收characters方法得到的content内容

 def startDocument(self): #students 对象开始
 print("对象开始")

 def endDocument(self): #students 对象结束
 print("对象结束")

 def startElement(self, name, attrs): #每一个标签元素的开始,name:标签名称 attrs:标签内部相应属性
 if name=='student': #如果标签名是 studentname
 self.student=Student() #创建一个Book()对象

 def endElement(self, name): #每一个标签元素的结束,name:标签名称 (此时才会得到相应的content)
 if name=='studentname':
 self.student.studentname=self.tag #对象的标签名=得到相应content的值
 if name=='age':
 self.student.age=self.tag
 if name=='class':
 self.student.class_=self.tag
 if name=='student':
 students.append(self.student) #为定义的数组追加得到的相应元素

 def characters(self, content):
 self.tag=content #写了self的,就可以定义为全局变量

parse("E:\python\Study\小经验\data\student.xml",STdemo()) #parse的方法,分别指明xml文件,并调用查找的类方法
for i in students: #对数组books[]循环
 print(i)

结果

D:\import\python3.7\python.exe E:/python/Study/小经验/python对XML的解析/python对XML的解析-Sax解析器.py
对象开始
对象结束
张三,18,信管171
王洋,19,软件178
天天,21,网络177

Process finished with exit code 0