鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站制作教程 > XML/RSS > >

将 XML 和 Python 结合起来(1)

来源:互联网 作者:佚名 时间:2015-03-04 06:44
在许多情况下,Python 是使用 XML 文档的理想语言。像 Perl、REBOL、REXX 和 TCL 一样,它是一种灵活的脚本语言,并且有强大的文本操作能力。而且,XML 文档除了编码大多数类型的文本文件(或流文件),通常还编码大量复杂的数据结构。文本处理中常见的“读

在许多情况下,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),或所遇到的标记的列表/词典)。

尝试 xmllib 的代码

      #-------------------- 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()

网友评论
<