IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  XML  >

技巧: 使用特定于语言的工具来进行 XML 处理

选择使用 SAX 和 DOM

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

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"CastorJBindJiBX 工具与 JAXB 有相似的特性。Python 用户有 Anobindgnosis.xml.objectifyxmltramp,它们从直接检查源 XML 代码开始操作,然后是 generateDS.py,它使用 W3C XML Schema 来驱动绑定。Perl 的一个选项是 XML::Smart





回页首


结束语

所以不管您喜欢哪种语言,都有很多种处理 XML 的选择。不要害怕抛弃常规方法而寻找两种主流方法以外的其他选择。



参考资料



关于作者

Uche Ogbuji 的照片

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




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款