PyXML学习笔记

发布时间:2005年01月11日

更新时间:2006年03月13日

Abstract

PyXML是python中的一个XML工具集,里面包括有很多处理XML文档的程序,如PySAX,Expat和xmlproc等。Python通过该套工具能很好地处理xml文档,为了在zope中使用xml文档,我开始了学习该套工具的旅程,快跟我来吧,一起感受XML的革命浪潮。


Table of Contents

1. SAX分析器
1.1. 示例

List of Tables

1.1. ContentHandler类的方法
1.2. DTDHandler类的方法
1.3. ErrorHandler类的方法

Chapter 1. SAX分析器

Table of Contents

1.1. 示例

XML简单API(SAX,Simple API for XML)是一个XML分析器的标准,基于事件驱动方式。

Table 1.1. ContentHandler类的方法

方法描述
startDocument()在文档开头触发
endDocument()在文档结尾触发
startElement(name,attrs)遇到开始元素时触发,name是元素名,attrs是元素属性字典
endElement(name)遇到结束元素时触发,name是元素名
startElementNS(name,qname,attrs)处理名字空间,遇到开始元素时触发,name是元素名,是一个元组,包含URI和本地名,如namespace:title返回(‘namespace','title')。qname是从XML中标识的原始元素名,attrs是元素属性字典。
endElementNS(name,qname)处理名字空间,遇到结尾元素时触发,name和qname的含义同上
characters(content)遇到字符数据时触发
processingInstruction(target,data)在标识处理指令时触发
skippedEntity(name)在跳过实体时触发

Table 1.2. DTDHandler类的方法

方法描述
notationDecl(name,publicId,systemId)注释声明触发
unparsedEntityDecl(name,publicId,systemId,ndata)非分析实体触发

Table 1.3. ErrorHandler类的方法

方法描述
error(exception)在分析器遇到可恢复错误时调用,默认情况下,这个方法通过SAXException类发出一个异常。
fatalError(exception)在分析器遇到致命错误时调用,调用该方法时,分析时停止
warning(exception)在分析器遇到警告时调用,返回后,分析器继续。

1.1. 示例

下面是一个使用python标准的xml.sax模块处理xml文档的示例。

#!/usr/bin/python
#-*- encoding:utf-8 -*-

from xml.sax import make_parser
from xml.sax import ContentHandler
import string

class MyHandler(ContentHandler):
        isHi=""
        hi=""
        def startElement(self,name,attrs):    #遇到元素开头时执行,如<para>
                if name=="hi":
                        self.isHi=1
        def endElement(self,name):            #遇到元素尾时执行,如</para>
                if name=="hi":
                        self.isHi=""
        def characters(self,content):         #获取元素内容
                if self.isHi:
                        self.hi+=content
ch = MyHandler()                              #生成ContentHandler的实例
saxparser = make_parser()                     #创建sax处理器
saxparser.setContentHandler(ch)               #关联sax处理器与ContentHandler实例
saxparser.parse('weather.xml')                #处理weather.xml文档

print "hi:",ch.hi                             #打印ch.hi的值

这里有一幅显示sax处理过程的图片。