<website> <page name="index" title="Home page"> <h1>Welcome to my Home page</h1> <p>Hi, there. My name is Mr.gumby,and this is my home page,here are some of my int:</p> <ul> <li><a href="interests/shouting.html">Shouting</a></li> <li><a href="interests/sleeping.html">Sleeping</a></li> <li><a href="interests/eating.html">Eating</a></li> </ul> </page> <directory name="interests"> <page name="shouting" title="Shouting"> <h1>shouting page</h1> <p>....</p> </page> <page name="sleeping" title="Sleeping"> <h1>sleeping page</h1> <p>...</p> </page> <page name="eating" title="Eating"> <h1>Eating page</h1> <p>....</p> </page> </directory> </website>
写一段python,解析并输出XML中的所有<h1>的标题。
1 #! /usr/bin/env python 2 #coding=utf-8 3 from xml.sax.handler import ContentHandler 4 from xml.sax import parse 5 6 class HeadlineHeader(ContentHandler): 7 in_headline=False 8 def __init__(self,headlines): 9 print 'init' 10 ContentHandler.__init__(self) 11 self.headlines=headlines 12 self.data=[] 13 def startElement(self,name,attrs): 14 print 'startElement'+' '+name 15 if name=='h1': 16 self.in_headline=True 17 def endElement(self,name): 18 print 'endElement'+' '+name 19 if name=='h1': 20 text=''.join(self.data) 21 self.data=[] 22 self.headlines.append(text) 23 self.in_headline=False 24 def characters(self,string): 25 print string 26 if self.in_headline: 27 self.data.append(string) 28 headlines=[] 29 print headlines 30 parse('website.xml',HeadlineHeader(headlines)) 31 32 print 'the following <h1> elements were found' 33 for h in headlines: 34 print h 35 print headlines
这段例子来自《python基础教程》,在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler,后面的这个类是要和parse函数来配合使用的。使用方式如下:
parse(‘xxx.xml’,xxxHandler),这里面的xxxHandler要继承上面的ContentHandler,不过只要继承就行,不需要有所作为。
然后这个parse函数在处理xml文件的时候,会调用xxxHandler中的startElement函数和endElement函数来一个xml中的标签的开始和结束,中间的过程使用一个名为characters的函数来处理标签内部的所有字符串。
开始我不太理解sax的执行方式,查阅了相关文档之后,发现sax是以事件驱动的,当XML中遇到开始标记时,就会触发startElemtn方法,当遇到字符是就会触发characters方法,当遇到结束标记是就会触发endElement方法,譬如解析<h1>xyz</h1>,paser读入整个<h1>标签头后调用startElement(),继续读x调用characters(),读y调用characters(),读z调用characters(),最后读入整个</h1>调用endElement()...
在这里为了更明白解析过程,所以在每个函数里面都增加了print方法,以此来更加明白XML解析过程,这段程序从29行执行起。
SAX和DOM的读取区别:两种处理方式不同点在于速度和范围,前者讲究的是效率,每次只处理文档的一小部分,快速而能有效的利用内存,后者是相反的处理方式,先把所有的文档载入到内存,然后再进行处理,速度比较慢,也比较消耗内存,唯一的好处就是可以操作整个文档。
浙公网安备 33010602011771号