在Python中将Python 2.0 XML 与一些规则表达式比较”样式通常不能很好地适合对 XML 进行彻底语法分析和处理,Python不仅有处理复杂数据结构的直接方法,还有一系列 XML 相关的模块可以帮助语法分析、处理和生成 XML。
XML-SIG (专门兴趣组)的成员为维护 Python 一系列 XML 工具做了许多工作。与其它 Python 专门兴趣组一样,XML-SIG 要维护邮件发送列表、列表档案、有用的参考大全、文档、标准包和其它资源(请参阅本文后的参考资料)。
从 Python 2.0 开始,Python 在其标准发行版中包括大多数 XML-SIG 项目。最新的 XML-SIG 包可能包含一些 Python 标准发行版中没有的“极端先进”特性,但出于面向绝大多数人的目的
-- 包括本文中的讨论 Python 2.0 XML 支持将是您感兴趣的。幸运的是,早期 Python 版本对 xmllib 的基本支持在 Python 2.0+ 下有了很大进步。目前,Python 用户能正常的选择。
DOM、SAX 和 expat 技术来处理 XML (使用其他编程语言的 XML 开发人员将会意识到这些)。xmllib 是一个非验证的低级语法分析器。应用程序员使用的 xmllib 可以覆盖 XMLParser 类,并提供处理文档元素(如特定或类属标记,或字符实体)的方法。
从 Python 1.5x 到 Python 2.0+ 以来,xmllib 的使用方法并没变化;在绝大多数情况下更好的选择是使用 SAX 技术,它也是种面向流的技术,对语言和开发者来说更为标准。本文中的示例与原来专栏中的相同:包括一个叫做 quotations.dtd 的 DTD 以及这个 DTD 的文档sample.xml (请参阅参考资料,以获取本文中提到的文件的档案)。
以下的代码显示了 sample.xml 中每段引言的前几行,并生成了非常简单的未知标记和实体的 ASCII 指示符。经过分析的文本作为连续流来处理,所使用的任何累加器都由程序员负责(如标记中的字符串 (#PCDATA),或所遇到的标记的列表或词典)。
- classQuotationHandler(ContentHandler):
- """Crude extractor for quotations.dtd compliant XML document"""
- def__init__(self):
- self.in_quote = 0
- self.thisquote = ''
- defstartDocument(self):
- print '--- Begin Document ---'
- defstartElement(self, name, attrs):
- if name == 'quotation':
- print 'QUOTATION:'
- self.in_quote = 1
- else:
- selfself.thisquote = self.thisquote + '{'
- defendElement(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:
您可能需要展望标准 XML 支持的未来的原因是,在进行语法分析的同时需要进行验证。不幸的是,标准 Python 2.0 XML 包并不包括验证型语法分析器。xmlproc 是 python 原有的语法分析器,它执行几乎完整的验证。如果需要验证型语法分析器, xmlproc 是 Python 2.0 XML 当前唯一的选择。而且,xmlproc 提供其它语法分析器所不具备的各种高级和测试接口。
您可以直接导入 xml.parsers.expat。如果这样做,您就能获得 SAX 界面并不提供的一些特殊技巧。这样,xml.parsers.expat 与 SAX 相比有些“低级”。但 SAX 技术非常标准,对面向流的处理也非常好;
大多数情况下 SAX 的级别正合适。通常情况下,由于 make_parser() 函数已经能获得 expat 提供的性能,因此纯速度的差异很小,DOM 可以用于修改 XML 文档,因为可以创建一棵 DOM 树。
通过添加新节点和来回移动子树来修改这棵树,然后生成一个新的 XML 文档作为输出。您也可以自己构造一棵 DOM 树,然后将它转换成 XML;用这种方法生成 XML 输出比仅将 <tag1>...</tag1> 写入文件的方法更灵活。
【编辑推荐】