Java 技术和 XML 无疑是最近五年来最重要的编程开发工具。因此,用于在 Java 语言中处理 XML 的 API 就发展起来了。两个最流行的 —— 文档对象模 型 (DOM) 和 Simple API for XML (SAX) —— 已经产生巨大的影响,JDOM 和 数据绑定 API 也随之产生了。彻底理解其中一个或两个 API 是非常必要的;正 确使用全部 API 会让您成为权威。但是,越来越多的 Java 开发人员发现他们 不再需要广泛了解 SAX 和 DOM —— 这主要是由于 Sun Microsystems 的 JAXP 工具包。Java API for XML Processing (JAXP) 使得 XML 甚至对于 Java 初级 开发人员也变得易于掌握,并大大提高了高级开发人员的能力。也就是说,即使 使用 JAXP 的高级开发人员对于他们十分依赖的 API 也有误解。
本文假设您已基本了解 SAX 和 DOM。如果您完全不懂 XML 解析,那么可能 需要首先阅读在线参考资料中有关 SAX 和 DOM 的信息,或者浏览我的书。您不 需要精通回调或 DOM Node,但必须至少了解是 SAX 和 DOM 在解析 API。本文 还有助于基本了解它们之间的差别。如果您掌握了这些基本知识,本文将对您更 有帮助。
JAXP:是 API 还是抽象?
严格说来,JAXP 是 API,但更准确地说是抽象层。它没有提供解析 XML 的 新方法,没有添加到 SAX 或 DOM,也没有为 Java 和 XML 处理提供新功能。( 如果您还不相信这一点,那么阅读这篇文章算对了。)但是,JAXP 使得使用 DOM 和 SAX 来处理一些困难任务变得更容易。它还允许以开发商中立的方式处 理一些在使用 DOM 和 SAX API 时可能遇到的特定于开发商的任务。
逐渐晋级
在 Java 平台的早期版本中,JAXP 是核心平台中单独的下载。在 Java 5.0 中,JAXP 已经是 Java 语言的主要产品。如果已经有最新版本的 JDK,您就已 经获得了 JAXP。
没有 SAX、DOM 或另一个 XML 解析 API,则无法解析 XML。我曾经看到过许 多关于将 SAX、DOM、JDOM 和 dom4j 与 JAXP 进行比较的请求,但作这样的比 较是不可能的,因为前面四个 API 与 JAXP 具有完全不同的用途。SAX、DOM、 JDOM 和 dom4j 都解析 XML。JAXP 提供了一种到达这些解析器及其所涉及的数 据的方法,但并未提供一种解析 XML 文档的新方法。如果您要正确使用 JAXP, 则理解此差别是非常必要的。这还很有可能使您远远领先于您的 XML 开发同行 。
如果仍有疑问,请确保您具有 JAXP 发行版。启动 Web 浏览器并加载 JAXP API 文档。导航至位于 javax.xml.parsers 软件包中的 API 的解析部分。令人 奇怪的是,您将只找到六个类。这个 API 到底怎么回事?所有这些类都位于现 有解析器的顶部。其中两个类仅用于错误处理。JAXP 比人们想像的要简单得多 。那么为何会有混淆呢?
位于顶部
甚至 JDOM 和 dom4j与 JAXP 一样都位于其他解析 API 的顶部。但这两个 API 都提供了从 SAX 或 DOM 中访问数据的不同模型,它们在内部使用 SAX(带 有一些技巧和修改)来到达它们提供给用户的数据。
Sun 的 JAXP 和 Sun 的解析器
许多解析器/API 混淆来自于 Sun 软件包 JAXP 和该 JAXP 默认使用的解析 器。在 JAXP 的早期版本中,Sun 包括 JAXP API(带有刚才提到的六个类和一 些常用于转换的类)和 一个叫做 Crimson 的解析器。Crimson 是 com.sun.xml 软件包的一部分。在 JAXP 的新版本中 —— 包括在 JDK 中 —— Sun 已经重 新包装了 Apache Xerces 解析器。在这两种情况下,虽然解析器是 JAXP 发行 版的一部分,但不是 JAXP API 的一部分。
可以认为是 JDOM 附带了 Apache Xerces 解析器。该解析器不是 JDOM 的一 部分,但由 JDOM 使用,所以包括它是为了确保 JDOM 可以即装即用。同一原则 适用于 JAXP,但并未明确公布:JAXP 附带解析器是为了可以立即使用。但是, 许多人将 Sun 的解析器中包括的类作为 JAXP API 本身的一部分。例如,新闻 组上的常见问题通常是“我如何使用 JAXP 附带的 XMLDocument 类?它的作用 是什么?”答案有些复杂。
软件包名称中是什么?
当我第一次在 Java 1.5 中贸然打开源代码时,我惊奇于我所看到的 —— 或者更应该说是我没有 看到的。没有在正常中的软件包 org.apache.xerces 中 找到 Xerces,因为 Sun 将 Xerces 类重新分配给了 com.sun.org.apache.xerces.internal。(我发现这有点不正常,但没有人问我 。)在任何情况下,如果您在 JDK 中查找 Xerces,就能找到它。
首先,com.sun.xml.tree.XMLDocument 类不是 JAXP 的一部分。它是 Sun 的 Crimson 解析器的一部分,包装在 JAXP 的早期版本中。所以这个问题从一 开始就令人误解。其次,JAXP 的主要用途是在处理解析器时提供开发商独立性 。有了 JAXP,您可以用 Sun 的 XML 解析器、Apache 的 Xerces XML 解析器和 Oracle 的 XML 解析器来处理相同的代码。因而使用特定于 Sun 的类会违反使 用 JAXP 的要点。是否弄清楚了本主题是如何变得复杂起来的?JAXP 发行版中 的 API 和解析器已经组合在一起,一些开发人员误将解析器中的类和特性作为 API 的一部分,反之亦然。
既然弄清楚了所有的混淆,那么您就可以深入了解一些代码和概念了。