Rick Parrish(rfmobile@swbell.net)
独立顾问
2001 年 9 月
本文针对哪些不熟悉 XML 开发的 C 和 C++ 程序员,概述了为 XML 开发作准备而装配的工具。工具表概述了常规 XML 工具,如 IDE 和模式设计器、解析器、XSLT 工具、SOAP 和 XML-RPC 库,以及其它可以在 C 和/或 C++ 中使用或者实际上以 C 和/或 C++ 编写的库。本文包括了关于在 Windows、Unix 和 Linux 上安装开放源码库的建议,还有关键 XML 术语的简要词汇表。
似乎满眼望去,一些新的以源码形式发布的与 XML 相关的工具都是用 Java 编写。尽管 Java 在 XML 竞技场中占有明显优势,许多 C/C++ 程序员还是在进行 XML 的开发,而且现在有许多 XML 工具可供 C 和 C++ 程序员使用。我们将面对 XML 库问题,如验证、模式和 API 模型。接着,我们将研究常规 XML 工具的集合,如 IDE 和模式设计器。最后,我们将用一个列表进行总结,并且讨论可以在 C 和/或 C++ 中使用或者实际上以 C 和/或 C++ 编写的库。
在本文中,将跳过关于使用 XML 的争论;我假设您已经拥有充分的理由来等待掌握这种技术。另外,我们将把 XML 的更详细说明留给参考资料中的背景资源讲述。只要说 XML 是数据交换的标准(不仅是文件格式)就够了。数据可以是以 XML 格式的应用程序文件形式来进行交换的,或者通过网络连接进行交换,该网络连接只是因在线事务结束或网络连接关闭而遭到放弃之前存在短暂片刻。
此外,本文并不是评价工具的比较性评论。我的目的是说明您可能需要的工具类型,并向您指出可能的候选工具。您仍需要根据项目需要来研究、测试和比较工具特征,以装配最终的工具箱。
两套工具
要将 XML 合并到自己的软件项目中,在您的工具箱里应该有两套工具。第一套是方言设计器(或者更适当的叫法是“模式设计器”)。第二套工具包括将解析和 XML 生成特性添加到应用程序的软件库。
设计您自己的 XML 方言
XML 方言只是一组特殊的 XML 标记,以及一些关于如何组合这些标记的规则。目前,指定或定义 XML 方言的两种主要方式是通过文档类型定义(DTD)或 XML 模式。我将把这两者都称作模式。
您的项目域也许已经有了一个为您设计的特定模式。如果没有,您可以使用纯文本编辑器创建自己的模式。更精细的方法是使用可以检查语法的真正 方言设计器。(当以后尝试使用错误的模式来验证 XML 数据时,该模式不会起作用。)
设计工具
目前,大多数程序员的文本编辑器 — 尤其是在 IDE 中找到的文本编辑器 — 拥有正规的宏和模板支持,可用于某些特性,如语法突出显示和自动完成部分输入的字或短语。因此,我省略了关于任何只执行语法突出显示和自动完成的 XML 编辑器的讨论。Microsoft Word 或 Emacs 宏就可以实现这些特性,因此“XML 编辑器”应该有更多特性。
表 1 中显示的工具分为三种类别:
- IDE(集成开发环境,即瑞士军刀方法)
- 模式敏感的 XML 编辑器(补充在模式或 DTD 中找到的许可标记结构和属性)
- 模式设计器(用于编写自己的模式或 DTD)
因为表 1 中的所有工具都运行应用程序,所以它们适合于所有 XML 开发人员 — 不仅是那些使用 C++ 的开发人员(与本文中其它表中列出的工具不同)。
表 1. 各种平台的方言设计工具产品 | 供应商 | 描述 | 许可证 | 平台 |
Turbo XML | TIBCO/Extensibility | XML 模式/DTD 设计器和 IDE | 商业 | Java、Win32 |
Komodo | Active State | XML 编辑器和 IDE | 商业 | Linux、Win32、其它 |
XML Spy | Altova | 用于 XML 编辑和模式设计的 IDE | 商业 | Win32 |
XML Notepad | Microsoft | XML 编辑器 | 免费 | Win32 |
Morphon XML | Lunatech Research | 模式敏感的 XML 数据编辑器 | 商业 | Java |
XED | 爱丁堡大学 | 模式敏感的 XML 数据编辑器 | 非商业 | Win32、Linux、Unix |
Xeena | IBM alphaWorks | 模式敏感的 XML 数据编辑器 | 免费试用/商业 | Mac、Unix、Win32 |
Visual XML | Pierlou | 模式敏感的 XML 数据编辑器 | 非商业 | Java |
Netpadd | Phillip Lenssen | Microsoft 的 XML Notepad 的替代品 | 非商业 | Win32 |
XMetal | Softquad | DTD 敏感的 XML 编辑器 | 商业 | Win32 |
Merlot | Channelpoint | 可视 XML 编辑器;支持 DTD 插件 | 非商业 | Java |
XML Validator | ElCel Technologies | 命令行 XML 验证工具 | 非商业 | Win32 |
XML Canon | ElCel Technologies | 通过将 XML 数据与 DTD 合并来生成规范的 XML | 非商业 | Win32 |
C 和 C++ 工具
本文的其余部分提供了通过软件库向 C/C++ 程序员添加 XML 功能的基础。在本文的下一部分中,您将发现可以找到更多的命令行实用程序,软件库包含了它们作为测试和/或样本程序。例如,Transformiix 可以用作一个库、Perl 模块或命令行工具。
到现在为止,我尝试尽量少用 XML 相关的术语。可是,在您进一步阅读之前,如果还不熟悉 XML 基础知识,您也许应该浏览在 XML 术语侧栏中定义的术语。这些术语将帮助您理解本文的其余部分,并且在您亲自深入研究所提到的工具和库时帮助挑出它们的特征。
解析器
一旦您拥有了 DTD 或模式以及与其相配的 XML 文档,就需要一个解析器来读取并解释该 XML 文档。表 2 概述了 C/C++ 开发人员的解析器库。可是,在开始研究表中的网格时,需要一点背景知识。
验证
XML 解析器有两种形式:验证和非验证。您需要哪一种呢?如果您不使用正式的 DTD 或模式,验证特性对于您来说并不重要。如果您已经或者正在计划使用 DTD 或模式,您也许会首选验证解析器。(在这种情况下,我建议您还要学习如何阅读和手工写 DTD/模式,这样当发生验证问题时,您就可以处理错误。有时,错误在 DTD/模式中,因此您可以调试 DTD/模式文件和 XML 数据。)
解析器 API 模型
用于将软件与 XML 解析器结合的两种常用 API 模型是:文档模型和事件模型。文档 API 模型对 XML 数据进行解析以生成一个对象。对象将文档的内容抽象成树结构。应用程序对这个树结构对象进行操作。事件 API 模型使用回调机制向应用程序通报 XML 数据的结构。事件/回调通常在进行解析时发生。
API 标准:DOM 和 SAX
一般解析器 API 模型已经被进一步改进成特定 API 标准。W3C 已经推荐 DOM(级别 1 和 2,级别 3 正在草拟中)作为标准化文档 API 模型。SAX 虽然不是 W3C 项目,但它已经占有了事实上的标准事件 API 模型的地位。
W3C 标准
当比较解析器和其它 XML 工具中的特性时,请寻找 W3C 推荐的和正在形成的规范的支持,如名称空间、XPath、XLink、XInclude 和 XInfoset。请记住,XML 技术成熟得非常快,对第一级规范(如 DOM)的支持也许缺少了该规范第二级中引入的重要功能。如果最新规范形式的功能对于您的项目很重要,请相应地选择工具。
阅读下表
在表 2 中,“事件”栏指定了支持一个推或事件模型 API(如 SAX)的解析器。“文档”栏指定了支持拉或文档模型 API(如 DOM)的解析器。与前面一样,该表列出了商业和非商业工具(请参阅侧栏发放许可证以获取关于软件许可证的详细信息)。
库 | 供应商 | 事件 | 文档 | 特点 | 许可证 |
expat | James Clark/expat 小组 | 本机与 SAX | - | 带有本机 API 和 SAX 封装器的、非常快速的推模型解析器。 | LGPL(免费) |
libxml | Gnome | SAX | DOM | 非常强壮;SAX 与 DOM 封装器;执行 DTD 验证 | LGPL(免费) |
MSXML | Microsoft | SAX | DOM | Win32 的 Microsoft XML 库 | EULA(免费) |
Xerces | Apache Software Foundation | SAX | DOM | 执行 SAX 及 DOM 级别 1 和 2;DTD 验证;增加的 XML 模式 | Apache(免费) |
XTL | Vivid Creations | SAX | DOM | 带 SAX 和 DOM 的基于 STL 的 XML 工具箱 | 商业 |
RXP | 爱丁堡大学 | - | 本机 | 验证以 C 编写的了解名称空间的 XML 解析器 | GPL(免费) |
XML4C | IBM alphaWorks | SAX | DOM | IBM 发起的 Xerces 的变体 | Apache(免费) |
Oracle XDK 8i | Oracle | SAX | DOM | Oracle 主办的用于 C++ 的 XML 工具箱 | 非商业 |
Pull Parser | Extreme! Lab | - | 本机 | 印地安那大学发起的用于 C++ 的轻量型 XML 工具箱 | 非商业 |
XML Booster | PhiDaNi Software | - | 本机 | 解析器发生器,生成 C 源码解析器 | 商业 |
开放源码前三名
三种最流行的开放源码 XML 库是 expat、libxml 和 Xerces。这三者都是跨平台的,每一种都充当 XSLT 库实现的基础,一旦满足了基本 XML 需要之后,它就会给您一条成长途径。
- expat 是 James Clark 创始的开放源码面向事件的 XML 解析库。他已经将该项目转让给了 SourceForge 中的一个小组。有一个 SAX 封装器可供使用。在许多项目中都可以找到 expat 解析器,如开放源码浏览器 Mozilla、XSLT 处理器 Transformiix 和 RDF 工具 repat。
- libxml 为类似于 SAX 和 DOM 的操作提供了双重方式 API。它支持对 DTD 的验证,并且在 Gnome 的 XSLT 处理器 libxslt 中使用。libxml 经过重写,已作为 libxml(2) 发布,也许还称为 libxml2。这个库的用户应该确保他们拥有了当前版本。
- Xerces 是非常坚固的、拥有大量文档的库,它充当 IBM alphaWorks XML4C 库的基础。Xerces 还用于 Apache XSLT 处理器 Xalan 中。Xerces 支持 DOM、SAX,以及对 DTD 的验证。最新版本读取并解释了部分“W3C XML 模式推荐”(打算到 2001 年底实现完整的 XML 模式支持)。
将这三种最流行的库其中一种编译并链接到您的项目毫不费力。大多数软件包都包括了每个平台的详尽说明。这里是一些样本安装说明。
在 Windows 上构建开放源码库
在 Windows 上从头构建 libxml 是很简单的四个步骤:
- 下载源 tarball 文件。
- 使用诸如 Winzip 之类的程序将内容解压缩到一个目录中。请确认指示了解压缩实用程序保留 libxml 可能需要的任何子目录的路径名。
- 定位
./win32/dsp
子文件夹中的libxml2.dsw
文件,并从 MS Developer Studio 中打开它。 - 从 DevStudio 中的顶部菜单选择 Build All。这将构建所有样本和测试程序,以及运行它们所需的 libxml DLL。
可以使用上述步骤在 Windows 上构建 Xerces。唯一的区别就是查找 ./c/samples/Projects/Win32/VC6
子文件夹中的 samples.dsw
工作空间文件。
expat 已经开始包括了 DSP 项目 makefile。请查看 lib
和 xmlwf
子文件夹。
在 Unix 上构建开放源码库
对于在 Linux 或 Unix 上运行的项目,大多数情况下,您可以将源代码解包(untar)到一个空目录中,设置某些选项,然后输入“make”来构建共享库。Solaris 用户:不要忘记使用 GNU 解包实用程序。在 Slackware Linux 下的 bash shell 中,我使用以下代码:
|
XML 和 COM
MSXML 是 Microsoft 针对 Windows 系列操作系统提供的专利 XML,它被实现成一个可脚本化的 COM 对象集合,因此可以在其它语言环境中出色地工作,而且提供了大量文档。这个库支持 DOM,而且还有一个本机面向文档的接口。它还支持 SAX 事件。
作为 MSXML 的替代品,“Apache XML 项目”的 Xerces 库附带了一个 COM 封装器,这可以使它在许多情况下充当 MSXML 的仿制品。Vivid Creations 在它的 XTL 库中提供了 SAX 和 DOM API 的 COM 封装器,该产品也是 MSXML 的替代品。
XML 转换:XSLT 和 XQuery
转换是 XML 发展过程中从只是在元素和属性级别处理 XML 数据向前进阶的下一步。XML 转换对进入 XML 数据进行操作,以产生 XML 输出。转换可以重新组织标记结构、添加/除去标记和属性、进行过滤以放大 XML 数据的所选择部分。
XQuery 文档将转换过程称作查询,但含义是一样的。
XSLT 和 XQuery 是 XML 方言,用于指定如何对随机 XML 数据执行这样的操作。您可以编写一个脚本文件,改用 XSLT 或 XQurey 来代替 XML,从而代替将一些 XML 数据装入到 DOM 中,而且必须由程序操纵 DOM 版本来产生期望的结果。这种更通用的方法会产生更好的灵活性,并会缩短开发时间。现在,您的 Web 开发人员(他们不是 C/C++ 程序员)可以编写自己的 XML 转换,这可以让 C++ 程序员来完成更复杂的工作。
表 3. C/C++ 转换/查询库
库 | 供应商 | 特点 | 许可证 |
libxslt | Gnome | 构建在 libxml 之上 | 非商业 |
Xalan | Apache | 构建在 Xerces 解析器之上 | Apache(免费) |
Transformiix | MITRE | 构建在 expat 之上的 XSLT 处理器 | 非商业 |
xsltc | Oliver Gerardin | XSLT 编译器,产生 C 代码 | 非商业 |
sablotron | Ginger Alliance | XSL 引擎 | 非商业 |
消息传递:XML-RPC 和 SOAP 工具
对本文来说,消息传递是指让两个软件代理程序互相通信。这种消息传递有时称作面向消息的中间件。(这不是类似于 AOL、MSN 或 ICQ 的消息传递,知道吗?现在有一个尚处于未完成阶段的基于 XML 的即时消息传递协议成果称作 Jabber。我已经在参考资料中包含了一个链接以满足您的好奇心,但再次声明,那并不是我要在这里讨论的东西。)
使用 XML 进行消息传递已经非常流行,以至于已经产生了两个替代品:XML-RPC 和 SOAP。这些协议最显著的特征是根据开发人员用于实现的工具选择,客户机、服务器和同级设备可能会大相径庭。虽然所有开发人员都习惯使用他们偏爱的语言、开发工具箱或软件库,但他们仍然可以合作。
(附带说明:Gregor Purdy 已经用已提议的替代方法编写了一篇出色的 XML-RPC 评论(请参阅参考资料))。
表 4 包括了用于面向消息中间件类别的一些库。这并不是一个此类别中资源的详尽列表,有一些新的工具正在快速发展,但它是一个好的起点。
表 4. C/C++ 消息传递库
库 | 供应商 | 特点 | 许可证 | 平台 |
4S4C SOAP 服务 | Simon Fell | 开放源码 SOAP 成果 | 非商业 | Linux、Unix、Win32 |
SOAP 客户机 | SQL Data | C++ SOAP 客户机工具箱 | 商业 | Win32 |
SOAP 组件 | mozilla.org | 可脚本化 XPCOM 组件 | 非商业 | 许多 |
XML-RPC for C/C++ | First Peer | C 语言编写的 XML-RPC 库 | 非商业 | Linux、Unix、Win32 |
XML-RPC 组件 | mozilla.org | 可脚本化 XPCOM 组件 | 非商业 | 许多 |
XML-RPC for C/C++ | Epinions | C 语言编写的 XML-RPC 库 | 非商业 | Linux、Unix、Win32 |
题外话
这些工具应该给您的 XML 工具箱一个很好的起点。如果想要推荐已经尝试过的其它用于 XML 的 C/C++ 工具或者要发表任何其它意见,请加入本文所附的讨论中(请使用“参考资料”中的链接或单击文章页面顶部或底部的“讨论”图标)。
这些 XML 术语也许会在您理解本文中讨论的库时派上用场:
|
- 将您对 C/C++ 工具的见解或问题添加到本文的讨论中。(您可以使用此链接,或者单击页面顶部或底部的“讨论”图标。)
- 请访问 W3C XML 页面,该页面提供了 XML 规范中的大部分内容。
- 请访问 XML 相关软件的汇总站点。
- 请在此使用 Zvon 的通用 XML 教程或 developerWorks 的 Doug Tidwell 撰写的 XML 入门以及 XML 专区教学区域中的其它课程来获取 XML 的基础知识。
- 请阅读 Howard Katz 的 XQuery 简介。
- 请认真阅读 Gregor Purdy 撰写的出色的 critique of XML-RPC。
- 请在 Jane Fung 的文章XML 和 DTD 简介中学习编写 DTD 的基础知识。
- 请在 Michael Kay 的技术概述 XSLT 是什么类型的语言?中了解 XSLT。
- 请在 Jabber 上了解其它类型的消息传递(即时消息传递)的信息。
- 通过认真学习 IBM Certified Developer Program 的 XML Certification guidelines 来掌握 XML 开发人员技能。
- XML 规范 1.0:W3C 核心 XML 1.0 规范。
- DOM 级别 1.0:W3C 文档对象模型级别 1 API 推荐。
- DOM 级别 2.0:W3C 文档对象模型级别 2 API 推荐。
- SAX/SAX2:Simple API for XML 事件模型事实上的标准。
- 名称空间:处理 XML 名称空间的 W3C 推荐。
- XML 模式:关于 W3C XML 模式推荐的一切
关于作者 Rick 是一个老资格的程序员,他的职业生涯就是炒股和克服最后期限,同时给女招待足以使她们脸红的慷慨的小费。他的名字已经传遍了小镇里的每一个咖啡馆。他还喜欢在以技术为主题的研讨会上发表演讲。他的设计标新立异,现在他正在研究更时髦的建模方法,如 UML。他汽车的保险杆上写着:“I for XHTML.”。可以通过 rfmobile@swbell.net 与 Rick 联系。 |