Python与xml之解析篇

Pythonxml之解析篇

       转贴请注明出处http://blog.csdn.net/porcupinefinal

       网上关于xml文件解析的例子多如牛毛,用python解析的也不少,在百度输入python xml就会出来不少结果。我也是从这些例子和文章中学的,所以会有类似的地方,当然我也会加入自己的一些体会。

       dive into python》第五章对这一部分有较详尽的讲解,如果你不喜欢看英文的话,可到这个网站:http://www.chinesepython.org/pythonfoundry/limodoupydoc/dive/html/toc.html查阅。

       下边开始我们的xml解析之旅:

       处理xml有两种方法:

FIRSTSAXSimple API for XML。它的工作方式是,一次读出一点XML,对发现的每个元素调用一个方法。SAX XML 语法分析器的公用语法分析器接口。它允许应用程序作者编写使用 XML 语法分析器的应用程序,但是它却独立于所使用的语法分析器。(将它看作 XML JDBC。)(Lars Marius GarsholSAX for Python

功能:基本上是一个 XML 文档的顺序处理器。应用程序员将定义一个 handler 类,而不是语法分析器类,该 handler 类能注册到任何所使用的语法分析器中。必须定义 4 SAX 接口(每个接口都有几个方法):DocumentHandlerDTDHandlerEntityResolver ErrorHandler。创建语法分析器除非被覆盖,否则它还连接默认接口。

 

SECONDDOMDocument Object Model。它的工作方式是,一次读出整个XML文档,通过将本地的Python类链接到一个树型结构中,生成文档的一个内部表示。

 

这篇文章里我主要用的是SAX这种方法(在dive into python一书中用的是DOM这种方式,我将在下一篇文章pythonxml之更新篇中用这种方法举例如何增加、更新及删除xml文件中的某个节点。)我之所以选择这种方法是因为关于用DOM来解析xml的文章实在太多,没有什么从新写的必要,网上也有人说用DOM解析较大的xml文件时效率较低的问题(自己没有测试过,有人说是 5M 的文件要解析20分钟。。。是够慢的),所以我选择了用SAX来解析xml

 

       示例:(该示例转载自ibm上可爱的python系列)

       import string

import xml.sax

from xml.sax.handler import *

 

classQuotationHandler(ContentHandler):

    """Crude extractor for quotations.dtd compliant XML document"""

    def __init__(self):

        self.in_quote = 0

        self.thisquote = ''

    def startDocument(self):

        print '--- Begin Document ---'

    def startElement(self, name, attrs):

        if name == 'quotation':

            print 'QUOTATION:'

            self.in_quote = 1

        else:

            self.thisquote = self.thisquote + '{'

    def endElement(self, name):

        if name == 'quotation':

            print string.join(string.split(self.thisquote[:230]))+'...',

            print '('+str(len(self.thisquote))+' bytes)/n'

            self.thisquote = ''

            self.in_quote = 0

        else:

            self.thisquote = self.thisquote + '}'

    def characters(self, ch):

        if self.in_quote:

            self.thisquote = self.thisquote + ch

if __name__ == '__main__':

    parser = xml.sax.make_parser()

    handler = QuotationHandler()

    parser.setContentHandler(handler)

    parser.parse("sample.xml")

       要点:

1、  注意黑体加粗部分,首先继承ContentHandler,构造自己的handler

2、  剩下的startElementendElementcharacters三个接口必须实现,startElementendElement主要用于解析形如<school>北理</school>的结构,当处理器进入<school>时将in_quote置为1,在characters中将“北理”这个值赋于self.thisquote然后在endElement中可通过self.thisquote获得“北理”这一值;

3、  形如<class id=” 09120016” /><class id=” 09120016” ></class>的解析在startElement中进行,通过attrsattrs.get('id', None)获得“09120016”这一值。(在这个示例里没有,如有不明白的可以发email给我porcupine2004@126.com);

4、  parse() 方法处理整个流或字符串,所以不必为语法分析器创建循环;

5、  parse() 同样能灵活地接收一个文件名、一个文件对象,或是众多的类文件对象(一些具有 .read() 方式)

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值