class QuotationHandler(saxlib.HandlerBase):
"""Crude sax extractor for quotations.dtd 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)'
self.thisquote = ''
self.in_quote = 0
else:
self.thisquote = self.thisquote + '}'
def characters(self, ch, start, length):
if self.in_quote:
self.thisquote = self.thisquote + ch[start:start+length]
if __name__ == '__main__':
parser = saxexts.XMLParserFactory.make_parser()
handler = QuotationHandler()
parser.setDocumentHandler(handler)
parser.parseFile(open("sample.xml"))
parser.close() 与 [xmllib] 相比,关于示例要注意两件小事:'parseFile()'/'parse()' 方法处理整个流/字符串,所以不必为语法分析器创建循环;向 'characters()' 提供了大量数据,自变量会指出数据的大小和位置以及传递的字符串。不要假设变量 'ch' 将以什么形式传送给 'characters()'。包:DOMDOM 是一种 XML 文档的高级树型表示。该模型并非特定于 Python,而是一种普通 XML 模型。Python 的 DOM 包是针对 SAX 构建的,并且包括在 PyXML 发行版中。由于篇幅关系,没有将代码样本加到本文中,但在 XML-SIG 的 "Python/XML HOWTO" 中给出了一个极好的总体描述。“文档对象模型”(DOM) 为 XML 文档指定了树型表示。顶级文档实例是树的根,它只有一个子代,即顶级元素实例;这个元素有表示内容和子元素的子节点,他们也可以有子代。定义的函数允许随意遍历结果树,访问元素和属性值,插入和删除节点,以及将树转换回 XML。DOM 可以用于修改 XML 文档,因为可以创建一棵 DOM 树,通过添加新节点和来回移动子树来修改这棵树,然后生成一个新的 XML 文档作为输出。您也可以自己构造一棵 DOM 树,然后将它转换成 XML;用这种方法生成 XML 输出比仅将 ... 写入文件的方法更灵活。包:Pyxie[pyxie] 模块从 XML-SIG 构建到 PyXML 发行版之上,它为 XML 文档提供了附加的高级接口。[pyxie] 将完成两项基本操作:它将 XML 文档转换成一种更易于进行语法分析的基于行的格式;并且它提供了将 XML 文档当作可操作树处理的方法。[pyxie] 所使用的基于行的 PYX 格式是独立于语言的,其工具适用于几种语言。总之,文档的 PYX 表示与其 XML 表示相比,更易于使用常见的基于行的文本处理工具进行处理,如 grep、sed、awk、bash、Perl,或标准 python 模块,如 [string] 和 [re]。根据结果,从 XML 转换到 PYX 可能节省许多工作。[pyxie] 将 XML 文档当作树处理的概念与 DOM 中的思路相似





