扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
在本页阅读全文(共19页)
在许多情况下,Python 是使用 XML 文档的理想语言。像 Perl、REBOL、REXX 和 TCL 一样,它是一种灵活的脚本语言,并且有强大的文本操作能力。而且,XML 文档除了编码大多数类型的文本文件(或流文件),通常还编码大量复杂的数据结构。文本处理中常见的“读取几行,并将它们与一些规则表达式比较”样式通常不能很好地适合对 XML 进行彻底语法分析和处理。幸好,Python(与大多数其它语言相比)不仅有直接处理复杂数据结构的方法(通常使用类和属性),还有许多 XML 相关的模块可以帮助语法分析、处理和生成 XML。
关于 XML,要记住一个总体概念:可以验证或非验证方式处理 XML 文档。在以前的处理类型中,读取 XML 文档之前,必须先读取“文档类型定义”(DTD)。这种情况下,处理将总体计算 XML 文档的简单句型规则,还将计算 DTD 的特定语法约束。大多数情况下,使用非验证处理就可以了(通常运行更快,更适合程序) -- 我们相信文档创建者遵循文档范围的规则。在下面讨论的大多数模块都是非验证型;如果存在验证选项,则描述将指出。
中心资源库 (Vaults of Parnassus)最近已成为查找 Python 资源的标准方法。可以在那个站点上找到所有以下讨论的模块。特别地,可以在资源库中找到 PyXML 发行版,它是 tar 文件和 Win32 形式的安装程序。
Python 的 XML 特殊兴趣组 (XML-SIG)
XML-SIG 的成员执行了许多 -- 或大部分 -- 维护 Python 一部分 XML 工具的任务。与其它 Python SIG 一样,XML-SIG 要维护邮件发送列表、列表档案、有用的参考大权、文档、标准包和其它资源。阅读了本文中的概述后,最好从 XML-SIG Web 页面入手。
根据本文中讲述的特定重点,XML-SIG 维护了 PyXML 发行版。这个包包含了许多本文中讨论的模块,一些“入门”文档,一些演示代码和其它一些 XML-SIG 决定放入该发行版的东西。给定的包也许不会总是包含每个独立模块或工具的最新版本,但下载 PyXML 发行版是个好主意。以后,可以随时添加任何未包含的模块,或者已包含模块的新版本(以及许多 PyXML 发行版提供的服务所未包含的模块)。
模块:XMLLIB 模块(标准)
“不包括在标准发行版中”,Python 1.5.* 带有模块 [xmllib]。Python 1.6 也许结合了更多 XML-SIG 的成就,但它仍是测试版。[xmllib] 是一个非验证的低级语法分析器。[xmllib] 的工作方式是用应用程序覆盖 XMLParser 类,并提供处理文档元素(如特定或类属标记,或字符实体)的方法。
作为正在使用的 [xmllib] 示例,PyXML 发行版包括一个叫做 'quotations.dtd' 的 DTD,以及这个 DTD 的文档 'sample.xml'。以下的代码显示了 'sample.xml' 中每段引言的前几行,并生成了非常简单的未知标记和实体的 ASCII 指示符。经过分析的文本作为连续流来处理,所使用的任何累加器都由程序员负责(如标记中的字符串 (#PCDATA),或所遇到的标记的列表/词典)。
#-------------------- try_xmllib.py --------------------# import xmllib, string class QuotationParser(xmllib.XMLParser): """Crude xmllib extractor for quotations.dtd document""" def __init__(self): xmllib.XMLParser.__init__(self) self.thisquote = '' # quotation accumulator def handle_data(self, data): self.thisquote = self.thisquote + data def syntax_error(self, message): pass def start_quotations(self, attrs): # top level tag print '--- Begin Document ---' def start_quotation(self, attrs): print 'QUOTATION:' def end_quotation(self): print string.join(string.split(self.thisquote[:230]))+'...', print '('+str(len(self.thisquote))+' bytes)' self.thisquote = '' def unknown_starttag(self, tag, attrs): self.thisquote = self.thisquote + '{' def unknown_endtag(self, tag): self.thisquote = self.thisquote + '}' def unknown_charref(self, ref): self.thisquote = self.thisquote + '?' def unknown_entityref(self, ref): self.thisquote = self.thisquote + '#' if __name__ == '__main__': parser = QuotationParser() for c in open("sample.xml").read(): parser.feed(c) parser.close() |
其它语法分析模块
PyXML 发行版包含了几个具有各种功能的附加语法分析模块。提供这些模块是为了对基本 [xmllib] 模块做一些改进。
[pyexpat] 是 GPL 方式的 XML 语法分析器工具箱 'expat' 的封装程序。'expat' 是用 C 语言写的库,这就意味着任何想要利用它的语言都可以使用它。'expat' 是非验证型,因此它比原来的 Python 语法分析器快很多。[sgmlop] 的目的与 [pyexpat] 相同。它也是非验证型,而且也用 C 语言编写。[pyexpat] 可以作为 MacOS 二进制使用,[sgmlop] 可以当作 Win32 二进制使用;但如果您需要使用不同的平台,那么就要用 C 编译器为您自己的平台构建模块。
[xmlproc] 是 python 原有的语法分析器,它执行几乎完整的验证。如果需要验证型语法分析器, [xmlproc] 是 Python 当前唯一的选择。同样,[xmlproc] 提供其它语法分析器所不具备的各种高级和测试接口。
如果决定使用 XML 的简单 API (SAX) -- 它应该用于复杂的事物,因为其它大部分工具都构建在它之上 -- 将为您完成许多语法分析器的分类工作。在 PyXML 发行版中,[xml.sax.drivers] 包含许多语法分析器的瘦封装程序,包括所有那些已讨论过的、名称形式为 'drv_*.py' 的语法分析器。但是,一般使用高级 SAX 设施访问驱动器,该设施自动选择系统上“最佳”的可用语法分析器:
#------------- selecting the best parser ---------------# from xml.sax.saxext import * parser = XMLParserFactory.make_parser() |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者