SAX 和 DOM 是两个主要的 XML 处理 API。开发人员通常知道最好的选择是 SAX(从解析器到分离处理程序的推式事件) 和 DOM(将文档解析成易于访问的对象树) 的标准模型。SAX 通常为大文档提供了好的性能,而 DOM 通常提供了更直接的代码。SAX 设计用于 Java 语言,但是到其他语言的绑定已经开发出来了。然而,在这些其他语言中,SAX 的 Java 特征通常展示出来了,而所使用的语言的优势则不再存在。DOM 设计为尽可能作为一种语言无关的方式,这一点在 ISO Interface Definition Language (IDL)中指定了。标准绑定是为 Java 语言和 ECMAScript (JavaScript) 而存在的,但这些依然会影响 IDL 的语言无关的结构,所有语言绑定,不管是官方的还是非官方的,也都取消了宿主语言的某些优势。
要更好地利用核心语言的优势,一些开发人员已经开发了本地针对特定语言的 XML 处理 API。几乎所有的知名语言都有一个或者多个工具包提供这种 API。有些时间,常规方法一直坚持最好使用 SAX 和 DOM 以便最大限度地提高可移植性,但是经验告诉我,这通常只是一个言过其实的考虑。对于某件事情,由于 SAX 和 DOM 的语言绑定有一些偏差,代码很少真正地进行跨语言移植,从一种语言到另一种语言移植时,进行代码改编的工作仍然相当重要。在同一种语言的多个实现之间,使用 SAX 和 DOM 通常确实提高了可移植性,但这必须在事实中进行权衡,因为不采用某些语言的优势经常会降低程序员的效率。
开发人员采用几种语言独立地进行早期探索的一个领域是
拉式
DOM(pull DOM),这是一个包装了 SAX 的系统,所以系统能够从解析器拉事件而不是将事件推出去。这种调整通常允许更直接的代码,并且实现起来通常使用本机语言结构,这样获得比纯
SAX 或者 DOM 更大的应用范围。
Java
Specification Requests (JSR #173) for Streaming API for XML (StAX)
是一个拉式解析 XML 的 Java API。其他拉式 API 包括用于 C、 C++、 Python、Perl 和其他语言的
libxml2's
xmlTextReader,它有 libxml2 包装器。Python 带有一个
xml.dm.pulldom
模块,它提供了一个拉式 API。
除了 SAX 和 DOM 之外,另一个早期惯用法是开发把 XML 转换成本机语言常用数据结构的工具 —— 一个叫做 编组(unmarshalling)的过程 —— 与之相对的是 解组)。这个想法是为了使开发人员采用自己喜欢的特定语言,而不必真正考虑数据背后的 XML 。不幸的是,许多开发人员不喜欢 XML,而这通常又是他们能够发现 XML 好处的唯一方式。但即使对于那些喜欢 XML 的开发人员,编组工具对于快速简洁地处理也是有用的: JDOM 是类似于 DOM 的 API,它严格局限于 Java 语言习惯;Python 用户有 ElementTree,它从 XML 创建专用的数据结构,重点是元素;Perl 用户现在更喜欢老式的 XML::Grove,它用一棵 Perl 散列树来交换已解析的 XML、HTML 或者 SGML;Ruby 用户有 XMLification,用于 Ruby 对象到 XML 的非常简单的转换;PHP 可以选择 class_path_parser.php,它允许您为 XML 源注册类似于 XPath 的表达式,并据此调度 PHP 处理器函数;Haskell 的选择是 Haskell2Xml,它允许您读取和编写普通的 Haskell 数据作为 XML 文档。
编组方法作为一种最流行的选择正显露出来,它使用 XML 模式语言和其他源代码用本机语言创建数据结构,这种结构使用了用 XML 文档表达的词汇表。这种系统称为 XML 数据绑定,在很多情况下,它们导致最自然合理的 XML 操纵。Java 技术用户可以看看 JSR #31, "XML Data Binding Specification"。 Castor、 JBind 和 JiBX 工具与 JAXB 有相似的特性。Python 用户有 Anobind、 gnosis.xml.objectify 和 xmltramp,它们从直接检查源 XML 代码开始操作,然后是 generateDS.py,它使用 W3C XML Schema 来驱动绑定。Perl 的一个选项是 XML::Smart。
所以不管您喜欢哪种语言,都有很多种处理 XML 的选择。不要害怕抛弃常规方法而寻找两种主流方法以外的其他选择。
- 您可以参阅本文在 developerWorks 全球站点上的
英文原文.
- 参考
JSR
#173, Java 语言的一个拉式 API。您还可以在 Berthold Daum 的
developerWorks
技巧系列文章中学习更多关于 StAX 的知识:
- “ 使用 XML 流解析器” (2003 年 11 月)
- “ 使用 StAX 部分解析 XML 文档”(2003 年 12 月)
- “ 使用 StAX 高效筛选 XML 文档”(2003 年 12 月)
- “ 使用 StAX 编写 XML 文档”(2003 年 12 月)
- “ 使用 StAX 合并 XML 文档” (2004 年 1 月)
- 学习
Libxml2's
XmlTextReader Interface,C、C++、Perl、Python 和其他语言的一个拉式 API。
- 试试
xml.dom.pulldom,
用于拉式处理的 Python 库。
- 用于 XML、SGML 和 HTML 的 Perl 数据结构,看看
XML::Grove。
- 使用
XMLification
将 Ruby 对象转换成 XML。
- 使用
class_path_parser.php
来调度基于 XML 和 PHP 函数。
- 访问
HaXml 项目。它包括了 Haskell2Xml, Haskell2Xml 用普通的 Haskell 对象来交换 XML。
- 试试
JDOM,一个以
Java 为中心的 DOM 变种。
- Dennis M. Sosnoski 在有关数据绑定的
developerWorks
系列文章中对 Java 数据绑定工具作了很好的介绍:
- 第 1 部分:代码生成方法 — JAXB 及其它(2003 年 1 月)
- 第 2 部分:性能(2003 年 1 月)
- 第 3 部分:JiBX 体系结构(2003 年 4 月)
- 第 4 部分:使用 JiBX(2003 年 4 月)
- 深入阅读
ElementTree,这是一个易于使用的表示
XML 文档的 Python 数据结构。
-
Anobind、
gnosis.xml.objectify
和
xmltramp
是基本的 Python 数据绑定工具。
generateDS.py
使用了 W3C XML Schema。更多关于 gnosis.xml.objectify 的信息,请参考 David Mertz 在
developerWorks
上的
XML 问题
专栏。
- 需要 Perl 的数据绑定工具吗?试试
XML::Smart。
- 在
developerWorks
Web
services和
XML
专区中,可以找到大量有关这两种最流行技术的文章、专栏、教程和技巧。
- 了解如何才能成为
IBM
认证的 XML 和相关技术的开发人员。

Uche Ogbuji 是 Fourthought Inc. 的顾问和共同创始人,该公司是专为企业知识管理提供 XML 解决方案的软件供应商和咨询公司。Fourthought 开发了 4Suite,这是一个用于 XML、RDF 和知识管理应用程序的开放源代码平台。Ogbuji 先生是一位出生于尼日利亚的计算机工程师和作家,他现在美国科罗拉多州博耳德(Boulder)生活和工作。可以通过 uche.ogbuji@fourthought.com 与 Ogbuji 先生联系。