Python SAX 处理XML文件

来源:互联网 发布:淘宝线上推广 编辑:程序博客网 时间:2024/05/02 02:22

SAX的简介:

SAX是基于事件驱动的。在处理过程中,它将XML文档的处理转化为一系列事件的处理,通过事件处理器处理XML文档。它的速度很快,而且占用的内存很小,适用于一些比较大的XML文件。

这里我们使用 SAX 解析以下内容的 XML 文件,打印输出所有 2008 年入学的学生的不
及格记录。注:学号(sno)的头四位表示了学生的入学年份。

ps:本文参考了此博客:http://fengjianjian007-qq-com.iteye.com/blog/1701426

先上处理代码:

# -*- 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文件:

student.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 documentend xml document200818237 = 张三 = 文学 => 50200818180 = 王二麻子 = 文学 => 35>>> 

注:相对于DOM等其他方式,SAX解析速度更快,但是操作相对复杂,这几天在学习Web Service,跟着老师学习了一些XML的处理。

0 0
原创粉丝点击