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