级别: 初级 David Mertz,博士 (mertz@gnosis.cx), 筛选者, Gnosis Software,Inc.
2002 年 1 月 01 日 Python 模块的 4Suite 集被认为是对于 XML 工具的‘内行的选择’。由于其范围和复杂性,4Suite 工具给程序员同时带来了强大的功能和陡峭的学习曲线。但是对于扩展 Python 的最近版本所提供的 XML 基本能力,4Suite 提供了有用的选项。本文中,David 研究了 4Suite 最引人注目的方面,并向您展示了它如何将有用的能力添加到 Python/XML 工具集。
在
可爱的 Python专栏的早期部分中(其中部分文章发表在 IBM developerWorks XML 专区中 ― 请参阅
参考资料),我介绍了标准分发版(distribution)中包含的 Python XML 模块,以及少数添加了一些有用(但是相当有限的)增强的其它模块。我在那些文章中未讨论 Python XML 工具中的巨无霸,4Suite。
4Suite 本身只是 Fourthought,Inc. 领导的相当庞大的开放源码项目的一半(并且大部分由我的朋友,developerWorks 专栏作家 Uche Ogbuji 负责)。其余部分是 4Suite Server。如果说 4Suite 内容十分丰富,要花好一会儿时间才能了解关于它的一切,那么,对于 4Suite Server,这个时间肯定会激增。在这个方面,4Suite Server 很象另一个大型 Python 服务器项目 Zope。4Suite Server 是一个存储和操作 XML 的非常通用的后端,而且提供了与 XML 文档存储相互操作的能力。4Suite Server 旨在简化将 XML 与现有进程和系统的集成,它允许您利用已有的业务逻辑(以及数据格式)。
实际上,4Suite Server 所能做的远不止本文中将要讲述的这些。目前,我只打算研究 4Suite 本身,但即便如此,也只讨论我觉得最有趣的零星部分(我希望这些部分也是对您最有用的)。
在某种程度上,4Suite 增强了现有的 PyXML 能力。其中一个增强是(目前是测试版)
cDomlette 模块,在构建复杂 DOM 树方面,它的速度比 PyXML 的缺省 DOM 实现快得多。但是 4Suite 主要由一系列工具构成,这些工具比单独 PyXML 能完成更高级的工作。大体上,这些工具是:
4XSLT 、
4XPath 、
4ODS 和
4RDF 。后面将对每个工具进行描述。
4Suite 入门
要了解 4Suite,首先应该到 4Suite 网站下载一个分发版(请参阅
参考资料)。另外,您应该获取名称为 4Suite-docs-0_11_1.zip 的文档文件(或者是一个等价的压缩包,直到出现了更新的版本)。这些文档包含 4Suite 工具的重叠描述;这些描述显然比在源压缩文档中找到的更完整。尤其是,文档的压缩文档中包含两个非常有用的目录,名称是
demo和
demos,它们提供了这些工具的良好示例。
您很可能需要获得 Python 安装中包含的常规 PyXML 分发版的一个更新。安装细节似乎取决于您使用的特定平台和 Python 版本。然而,最安全的方法是从 SourceForge.net(请参阅
参考资料)下载和安装最新的 PyXML 分发版,并安装 4Suite。
一旦安装好了必需的部分,您就可以使用几个命令行工具,以及许多新模块;大多数模块在
Ft 层次结构下,但是也会产生
xml 层次结构内的一些更新。
关于 DOM 的只言片语
Python 有很多 DOM 引擎,这却有点令人为难。显然未必能从中选出合适的,而安装 4Suite 则会添加更多的选项。在安装了 4Suite 之后,您可能使用这些几乎等价的导入中的任何一个,如下所示:
获取用 Python 写的 DOM 的几种方法
>>>
from
xml.dom
import
minidom as dom1
>>>
from
xml.dom
import
pulldom as dom2
>>>
from
Ft.Lib
import
pDomlette as dom3
>>>
from
Ft.Lib
import
cDomlette as dom4
|
“标准”技术是使用
minidom (尽管在 Python 2.0 之前,这还没有明确)。
pulldom 构建在
minidom 之上,但是可以有选择地构建子树。4Suite 的
pDomlette 大体上等价于
minidom ,但可能存在一些 API 差异。此外,4Suite 工具依赖于
pDomlette 。
cDomlette 可能是一种更快的构建 DOM 树的方法,但目前是测试版,并且可能不能与其它模块完全 API 兼容。
糊涂了?我也是,真的。但是,如果您能假设不存在 4Suite,那么就使用 Python 标准导入;如果正在使用 4Suite,您或许会使用更高级的模块,它们将负责导入要使用的 DOM。
4XSLT
最通用的执行 XSLT 转换的 4Suite 工具。
4XSLT 是命令行版本。它的源代码值得一看:
4XSLT Python 命令行脚本
#!/usr/bin/env python
from
xml.xslt
import
_4xslt
_4xslt.XsltCommandLineApp().run()
|
这两行代码就是您创建 XSLT 转换引擎的命令行版本所需要的全部脚本,并且实现步骤在 CGI 或其它 Web 服务器环境中都非常类似,或可将实现步骤作为批处理的一个部分。在 4Suite 包中就有一个命令行工具,类似于诸如 Sablotron(sabcmd)、Saxon 或 Xalan 一类的工具。当然,拥有一个用 Python 写的工具很不错,尤其是当您是个 Python 程序员时。
通过传递
--help 选项,可以查看 4XSLT 允许的命令行选项。这些选项非常类似于其它命令行处理器。验证是可选的,URL 可以作为参数指定。这允许您在因特网上的任何 XML 文档上执行任何类型的转换,这些转换都比较方便。例如:
4XSLT 作为命令行工具运行
% 4xslt -i http://gnosis.cx/publish/mertz/chap5.xml
http://gnosis.cx/publish/mertz/chapter.xsl
|
上面的脚本将由 Sablotron(sabcmd)静态生成的完全相同的 HTML 文档发送到
STDOUT ,该文档位于
http://gnosis.cx/publish/mertz/chap5.html (在
XML 问题#5 中讨论过,请参阅
参考资料)。
将 4XSLT 转换合并到更大的 Python 应用程序中同样容易。基本上,程序员只需要挑选一个样式表,然后对 XML 文档运行转换。例如:
4XSLT 用法的样本 Python 代码片段
from
xml.xslt.Processor
import
Processor
proc1,proc2 = Processor(),Processor()
proc1.appendStylesheetUri(
'mime.xsl'
)
result1 = processor.runUri(
'message.xml'
)
proc2.appendStylesheetString(open('mime.xsl').read())
result2 = proc2.runString(open('message.xml').read())
print
result1,result2
|
而且,由于 4XSLT 转换是基于内存中的 DOM 树的,因此只对该树的一个节点应用 XSLT 转换也同样简单。如果希望依照转换来变更 DOM 子树,请使用
Processor() 的
.runNode() 方法;如果只希望返回转换的结果,请使用
.execute() 方法。
4xupdate
4Suite 包中的另一个小命令行工具实用程序称为
4xupdate 。XUpdate 规范提供了 SQL
UPDATE 或
INSERT 语句的一种模拟,但它用于 XML 文档而不是关系数据库。在这个规范幕后的思想是提供一种对 XML 文档做微小更改的轻量型方法,这种方法不需要 SAX 或 DOM 方法所需的大量定制编程。XUpdate 指令在 XML 中指定其自身,这点很象 XSLT ― XPath 路径用于指定操作的文档位置。
4XPath
XPath 是在 XML 文档内描述节点路径的通用规范。XPath 规范是 XSLT 的组成部分,但它也用作其它 XML 技术的一部分。例如,当我决定为先前专栏文章中的大型 XML 文档开发一个索引生成器时,显然会选择 XPath 作为描述 XML 各部分的语法。
随 4Suite 一起提供的
xml.xpath 模块为涉及 XPath 描述的进一步编程提供了一个封装器。虽然 XPath 不需要 DOM 框架,但是 4XPath 提供一系列处理 DOM 树的实用程序。XPath 描述可以针对 DOM 树(或子树)运行,并将返回与描述匹配的节点对象列表。例如:
处理 XPath 节点匹配的 Python 代码片断
from
xml.dom.ext.reader
import
PyExpat
from
xml.xpath
import
Evaluate
reader = PyExpat.Reader()
dom = reader.fromString(some_function_to_get_XML())
path_descript =
'/this/that/other'
for
node
in
Evaluate(path_descript, dom.documentElement):
# do something with each matched node
|
上述代码片断(从 4Suite 演示程序中改编)递归遍历 DOM 树,查找具有
<that> 父节点和
<this> 祖父节点的
<other> 元素。但是,通常只对我们感兴趣的节点给出一个 XPath 描述要容易得多。
4ODS
在本文中我将只给出 ODS 的简短概述,主要是因为 4ODS 实际上并不是特定于 XML 的技术;另外,这部分有许多附带问题。在很大程度上,4ODS 是 4Suite 的一部分,因为 4Suite Server 期望它可用。
4ODS 的功能有点类似于 ZODB 的功能。实际上,4ODS 稍微简单些,它可以与
shelve 或
xml_pickle 作比较(即 4ODS 不包括本地事务性能力)。基本上,4ODS 是一种可以用来使 Python 对象在应用程序运行期间保持持久性的方法。当值得保持持久性时(用许多语言实现都很困难),其它 Python 工具都能很好地处理对象持久性。4ODS 的特别之处在于它专门实现了 ODMG 对象数据标准(Object Data Standard)v3.0(其它工具都无意实现)。除此之外,ODMG 标准使用 .odl 文件中的对象格式规范。如果您希望或者需要,除诸如
shelve 或
pickle 特别方法以外,4ODS 允许更正式的持续对象设计。
4RDF
RDF 是一种创建关于 XML 文档的“元数据”的方法。4RDF 包括一个库和一个命令行工具(
4rdf ),用于处理“资源描述框架(Resource Description Framework)”。当然,RDF 文档本身是 XML 格式的。要较好地了解 RDF 的用途,请阅读 Uche Ogbuji 关于该主题的 developerWorks 专栏文章(请参阅
参考资料)。
结束语
4Suite 库为 Python/XML 程序员的工具箱添加了许多高级能力。4XSLT 弥补了本机 Python XML 工具一个非常明显的缺陷。其它一些 4Suite 工具涉及了更多特定领域,但是,如果您的应用程序涉及这些特定领域,那么您有必要去研究一下它们。
参考资料
关于作者  | 
|  | David Mertz 在他的格言愿望中表示,希望自己已经创造了以下观点:关于标准,最重要的事情是可以有多种选择。可以通过 mertz@gnosis.cx 和 David 联系;在
http://gnosis.cx/publish/上可以了解他的生活。欢迎提出关于过去、现在和将来专栏的意见和建议。
|
对本文的评价
|