<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的读取区别:两种处理方式不同点在于速度和范围,前者讲究的是效率,每次只处理文档的一小部分,快速而能有效的利用内存,后者是相反的处理方式,先把所有的文档载入到内存,然后再进行处理,速度比较慢,也比较消耗内存,唯一的好处就是可以操作整个文档。

 

 

posted on 2013-02-13 23:22  马小跳  阅读(284)  评论(0)    收藏  举报