SAX的简介:
SAX是基于事件驱动的。在处理过程中,它将XML文档的处理转化为一系列事件的处理,通过事件处理器处理XML文档。它的速度很快,而且占用的内存很小,适用于一些比较大的XML文件。
这里我们使用 SAX 解析以下内容的 XML 文件,打印输出所有 2008 年入学的学生的不
及格记录。注:学号(sno)的头四位表示了学生的入学年份。
先上处理代码:
# -*- coding: utf-8 -*- #XML处理 #SAX处理XML的方式和Java中的SAX解析器一样,从ContentHandler方法中继承,并处理startDocument、endDocument等信息 from xml.sax import * #必须从xml.sax包中导入所有方法和变量 class MarkDecodeHandler(ContentHandler): #与Java的SAXParser基本一致,处理方法一样 marks=None#marks是列表存储一个一个的mark的 temp="" mystr="" currenttag=None mark=None #注意Python的特殊格式,必须有self作为第一个参数 def startDocument(self): print "start xml document" def endDocument(self): print "end xml document" #name=当前处理的标签名,attrs以dict的格式存放标签的所有属性 def startElement(self,name,attrs): if name=="marks": self.marks=[] elif name=="student": self.mark={"name":attrs['name']} self.mark.update({"sno":attrs['sno']}) elif name=="mark":<span style="font-family: Arial, Helvetica, sans-serif;">#如果标签名为mark,则记录此时的course名(因为course有很多个,这次使用mystr能够标识出course和其对应的分数)</span> self.mystr=attrs['course'] self.mark.update({self.mystr:''}) self.currenttag=name def endElement(self,name): if name=="student": self.marks.append(self.mark) elif name=="mark":#如果标签名为mark,插入这个标签对应的分数,比如{"math":80} self.mark.update({self.mystr:self.temp.strip()}) self.temp="" self.currenttag=None #content表示正在处理中的数据 def characters(self,content): self.temp+=content if __name__ == '__main__': #调用make_parser方法创建一个SAX解析器 # ''' print u"===============Python SAX方式解析XML文档===================" parser=make_parser() handler=MarkDecodeHandler() parser.setContentHandler(handler) data="" with open("Student.xml") as file: data=file.read().strip() import StringIO #StringIO模块用于将字符串转换成流数据,类似于Java的ByteArrayOutputStream和ByteArrayInputStream parser.parse(StringIO.StringIO(data)) for item in handler.marks:#marks是列表 for i in item.items(): key,value=i if key != 'name' and key != 'sno' and item['sno'][:4] == '2008' and int(value) < int(60): print item['sno'],'=',item['name'],'=',key,'=>',value #'''
给出相应的XML文件:
<?xml version="1.0" encoding="utf-8"?> <marks> <student name="张三" sno="200818237"> <mark course="物理">80</mark> <mark course="化学">85</mark> <mark course="生物">90</mark> <mark course="文学">50</mark> <mark course="代数">70</mark> </student> <student name="李四" sno="200918250"> <mark course="物理">30</mark> <mark course="化学">60</mark> <mark course="生物">90</mark> <mark course="代数">45</mark> </student> <student name="王二麻子" sno="200818180"> <mark course="物理">90</mark> <mark course="化学">85</mark> <mark course="生物">90</mark> <mark course="文学">35</mark> <mark course="代数">70</mark> </student> </marks>
解析结果:
>>> ===============Python SAX方式解析XML文档=================== start xml document end xml document 200818237 = 张三 = 文学 => 50 200818180 = 王二麻子 = 文学 => 35 >>>