牵着老婆满街逛

严以律己,宽以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

[转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读)

C/C++ 开发人员:充实您的 XML 工具箱
作者:Rick Parrish

提交者:eastvc 发布日期:2003-10-23 22:16:03
原文出处:http://www-900.ibm.com/developerWorks/cn/xml/x-ctlbx/index.shtml


本文针对哪些不熟悉 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 XMLTIBCO/ExtensibilityXML 模式/DTD 设计器和 IDE商业Java、Win32
KomodoActive StateXML 编辑器和 IDE商业Linux、Win32、其它
XML SpyAltova用于 XML 编辑和模式设计的 IDE商业Win32
XML NotepadMicrosoftXML 编辑器免费Win32
Morphon XMLLunatech Research模式敏感的 XML 数据编辑器商业Java
XED爱丁堡大学模式敏感的 XML 数据编辑器非商业Win32、Linux、Unix
XeenaIBM alphaWorks模式敏感的 XML 数据编辑器免费试用/商业Mac、Unix、Win32
Visual XMLPierlou模式敏感的 XML 数据编辑器非商业Java
NetpaddPhillip LenssenMicrosoft 的 XML Notepad 的替代品非商业Win32
XMetalSoftquadDTD 敏感的 XML 编辑器商业Win32
MerlotChannelpoint可视 XML 编辑器;支持 DTD 插件非商业Java
XML ValidatorElCel Technologies命令行 XML 验证工具非商业Win32
XML CanonElCel Technologies通过将 XML 数据与 DTD 合并来生成规范的 XML非商业Win32

C 和 C++ 工具
本文的其余部分提供了通过软件库向 C/C++ 程序员添加 XML 功能的基础。在本文的下一部分中,您将发现可以找到更多的命令行实用程序,软件库包含了它们作为测试和/或样本程序。例如,Transformiix 可以用作一个库、Perl 模块或命令行工具。

发放许可证

在所有工具表中,商业许可证表示必须购买该工具,才能将它用于产品环境中。试用版本(有时间限制或者禁用了主要特性)通常可供下载和评估。所有其它工具都有非商业许可证,不需要支付费用就能使用,但如果将它们用于商业项目中,请确保您将遵守许可证条款进行使用。例如,使用任何开放源码作为共享库或 DLL,应符合这些 XML 库附带的开放源码许可证协定(通常是 LGPL)。在表中,当可能不完全安装工具就能确定许可证类型时,就会指定非商业许可证的类型;该表使用 非商业来指定许可证条款比较模糊的免费软件。

常用的开放源码是 Apache、GPL、BSD 和 LGPL。并不允许在商业软件包中包含 GPL 代码,而 Apache 和 LGPL 代码可以在销售的软件中使用。这四个产品都限制在没有得到许可的情况下在派生产品中使用它们的名称。

到现在为止,我尝试尽量少用 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)的解析器。与前面一样,该表列出了商业和非商业工具(请参阅侧栏发放许可证以获取关于软件许可证的详细信息)。

表 2. C/C++ 开发人员的解析器
供应商事件文档特点许可证
expatJames Clark/expat 小组本机与 SAX-带有本机 API 和 SAX 封装器的、非常快速的推模型解析器。LGPL(免费)
libxmlGnomeSAXDOM非常强壮;SAX 与 DOM 封装器;执行 DTD 验证LGPL(免费)
MSXMLMicrosoftSAXDOMWin32 的 Microsoft XML 库EULA(免费)
XercesApache Software FoundationSAXDOM执行 SAX 及 DOM 级别 1 和 2;DTD 验证;增加的 XML 模式Apache(免费)
XTLVivid CreationsSAXDOM带 SAX 和 DOM 的基于 STL 的 XML 工具箱商业
RXP爱丁堡大学-本机验证以 C 编写的了解名称空间的 XML 解析器GPL(免费)
XML4CIBM alphaWorksSAXDOMIBM 发起的 Xerces 的变体Apache(免费)
Oracle XDK 8iOracleSAXDOMOracle 主办的用于 C++ 的 XML 工具箱非商业
Pull ParserExtreme! Lab-本机印地安那大学发起的用于 C++ 的轻量型 XML 工具箱非商业
XML BoosterPhiDaNi 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 是很简单的四个步骤:

  1. 下载源 tarball 文件。
  2. 使用诸如 Winzip 之类的程序将内容解压缩到一个目录中。请确认指示了解压缩实用程序保留 libxml 可能需要的任何子目录的路径名。
  3. 定位 ./win32/dsp 子文件夹中的 libxml2.dsw 文件,并从 MS Developer Studio 中打开它。
  4. 从 DevStudio 中的顶部菜单选择 Build All。这将构建所有样本和测试程序,以及运行它们所需的 libxml DLL。


可以使用上述步骤在 Windows 上构建 Xerces。唯一的区别就是查找 ./c/samples/Projects/Win32/VC6 子文件夹中的 samples.dsw 工作空间文件。

expat 已经开始包括了 DSP 项目 makefile。请查看 libxmlwf 子文件夹。

在 Unix 上构建开放源码库
对于在 Linux 或 Unix 上运行的项目,大多数情况下,您可以将源代码解包(untar)到一个空目录中,设置某些选项,然后输入“make”来构建共享库。Solaris 用户:不要忘记使用 GNU 解包实用程序。在 Slackware Linux 下的 bash shell 中,我使用以下代码:

tar -x 

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++ 转换/查询库
供应商特点许可证
libxsltGnome构建在 libxml 之上非商业
XalanApache构建在 Xerces 解析器之上Apache(免费)
TransformiixMITRE构建在 expat 之上的 XSLT 处理器非商业
xsltcOliver GerardinXSLT 编译器,产生 C 代码非商业
sablotronGinger AllianceXSL 引擎非商业

消息传递: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 DataC++ SOAP 客户机工具箱商业Win32
SOAP 组件mozilla.org可脚本化 XPCOM 组件非商业许多
XML-RPC for C/C++First PeerC 语言编写的 XML-RPC 库非商业Linux、Unix、Win32
XML-RPC 组件mozilla.org可脚本化 XPCOM 组件非商业许多
XML-RPC for C/C++EpinionsC 语言编写的 XML-RPC 库非商业Linux、Unix、Win32

题外话
这些工具应该给您的 XML 工具箱一个很好的起点。如果想要推荐已经尝试过的其它用于 XML 的 C/C++ 工具或者要发表任何其它意见,请加入本文所附的讨论中(请使用“参考资料”中的链接或单击文章页面顶部或底部的“讨论”图标)。

XML 术语

这些 XML 术语也许会在您理解本文中讨论的库时派上用场:

  • 文档模型:用于将 XML 数据当作树型对象进行解析和操纵的技术,也称作“拉”模型。请参阅作为示例的 DOM API 标准。
  • DOM:“文档对象模型”是 XML 文档的一种特殊树型结构编程模型,W3C 将它描述成一个标准。DOM 标准目前分成三个级别。DOM 1.0 是指 DOM 级别 1.0 一致性;DOM 级别 2 是最新的规范,W3C 正将它认可为“推荐”;DOM 级别 3 在本文创作时正在草拟中。
  • DTD:文档类型定义。一种 XML 文件,定义了 XML 元素和那些元素的 XML 属性,而且指定了如何嵌套 XML 标记以及元素可以包含什么数据的规则。请参阅 Jane Fung 的XML 和 DTD 简介以获取更多详细信息。
  • 事件模型:用于通过使用回调或处理程序对 XML 数据进行解析的技术;也称作“推”模型。例如,请参阅 SAX API 标准。
  • 名称空间:明确从不同的 DTD 或模式中标识出 XML 标记的方法,这样它们可以混合在同一个 XML 文档中。RDF 非常依赖于这个特性;XML 1.0 标记“xmlns”可以用于在 XML 文档中定义名称空间。
  • RDF:资源描述框架,用于将 XML 属性数据和通常驻留在别处的信息相关联的一种压缩 XML 方言。您的驱动程序的许可证就类似于描述您的 RDF XML 文件。
  • SAX:Simple API for XML 是用于 XML 解析器实现的标准编程接口;SAX 使用面向事件的编程模型。SAX 是由 David Megginson 最早开发的事实上的标准,现在由 XML-dev 邮件列表维护。
  • SOAP:“简单对象访问协议”是类似于 XML-RPC(请参阅 XML-RPC)的网络协议。通过使用 SOAP,应用程序可以创建远程对象、调用该对象上的方法,以及检索结果。
  • 验证:关于 DTD 和模式,验证结构良好的 XML 文档是否正确。
  • 结构良好:一个 XML 文档,它的标记和数据符合 XML 1.0 语法。
  • W3C:世界万维网联盟,它已经成为大多数 XML 相关技术的重要标准主体。W3C 将最终认可的规范称作“推荐”(而不是标准)。
  • XML 1.0:W3C 颂扬的第一个 XML 语法标准;建立了 XML 数据的基本规则,如所有标记都必须以斜杠(/)结束,如:,或者后跟一个结束标记,如: close the tag on your way out
  • XML-RPC:XML 远程过程调用。XML-RPC 是用于跨网络调用方法和服务的标准 XML 方言;就象您认为的那样,XML-RPC 使用 XML 进行客户机和服务器之间的消息传递。
  • XML 模式:XML 模式是一种 W3C 推荐,它类似于 DTD,用于定义 XML 文档的结构,但具有更好的灵活性。XML 模式使用 XML 1.0 语法来指定模式,这与用于 DTD 的比较早期的 SGML 语法相反。
  • XQuery:其部分功能类似于 XSLT,但设计得更有利于充当 XML 数据的查询语言 — 类似于在关系数据库中使用 SQL。作为规范,它还不如 XSLT 成熟,XQuery 也许会成为今后十年里的 SQL。
  • XSLT:可扩展样式语言转换,一种用于转换 XML 内容的 XML 方言。将 XSLT 文件应用于某些 XML 输入数据,以生成期望的 XML 输出数据。

参考资料

本文中提到的 XML 标准


关于作者
Rick 是一个老资格的程序员,他的职业生涯就是炒股和克服最后期限,同时给女招待足以使她们脸红的慷慨的小费。他的名字已经传遍了小镇里的每一个咖啡馆。他还喜欢在以技术为主题的研讨会上发表演讲。他的设计标新立异,现在他正在研究更时髦的建模方法,如 UML。他汽车的保险杆上写着:“I for XHTML.”。可以通过 rfmobile@swbell.net 与 Rick 联系。

posted on 2006-04-30 09:25 杨粼波 阅读(782) 评论(4)  编辑 收藏 引用 所属分类: 文章收藏

评论

# re: [转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读) 2006-04-30 15:05 jemmy

这么老的东西就不要转了啦  回复  更多评论   

# re: [转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读) 2006-04-30 17:45 天下奇毒

呵呵,我为了这玩意走了不少弯路,
看看也好。  回复  更多评论   

# re: [转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读) 2006-04-30 21:07 dudu

请不要在首页转载文章!  回复  更多评论   

# re: [转载]C/C++ 开发人员:充实您的 XML 工具箱(初涉XML的值得一读) 2006-05-02 19:26 snnn

我用的最多的还是libxml++
xquery刚开始学
挺喜欢berkeley db xml
  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理