级别: 中级 Uche Ogbuji (uche.ogbuji@fourthought.com), 首席顾问, Fourthought, Inc.
2004 年 2 月 01 日 DOM 和 SAX 是两种最有名的用于 XML 处理的系统,但它们是真正的跨编程语言的折中方法。因此,它们没有利用任何语言的特殊优势。如果避开常规方法而利用具有特殊优势的特定 API,经常会更好一些。
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 通常确实提高了可移植性,但这必须在事实中进行权衡,因为不采用某些语言的优势经常会降低程序员的效率。
拉式 API
开发人员采用几种语言独立地进行早期探索的一个领域是
拉式
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。
编组程序和 XML 数据结构
除了 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
数据绑定,在很多情况下,它们导致最自然合理的 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 的选择。不要害怕抛弃常规方法而寻找两种主流方法以外的其他选择。
参考资料
关于作者
对本文的评价
|