admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:结构体的形式)

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 文档。导航至位于 s 软件包中的 API 的

解析部分。令人奇怪的是,您将只找到六个类。这个 API 到底怎么回事?所有

这些类都位于现有解析器的顶部。其中两个类仅用于错误处理。JAXP 比人们想

像的要简单得多。那么为何会有混淆呢?

位于顶部

甚至 JDOM 和 dom4j(参阅 参考资料)与 JAXP 一样都位于其他解析 API 的顶

部。但这两个 API 都提供了从 SAX 或 DOM 中访问数据的不同模型,它们在内

部使用 SAX(带有一些技巧和修改)来到达它们提供给用户的数据。

Sun 的 JAXP 和 Sun 的解析器

许多解析器/API 混淆来自于 Sun 软件包 JAXP 和该 JAXP 默认使用的解析器。

在 JAXP 的早期版本中,Sun 包括 JAXP API(带有刚才提到的六个类和一些常

用于转换的类)

一个叫做 Crimson 的解析器。Crimson 是 软

件包的一部分。在 JAXP 的新版本中 —— 包括在 JDK 中 —— Sun 已经重新

包装了 Apache Xerces 解析器(参阅 参考资料)。在这两种情况下,虽然解析

器是 JAXP 发行版的一部分,但不是 JAXP API 的一部分。

可以认为是 JDOM 附带了 Apache Xerces 解析器。该解析器不是 JDOM 的一部

分,但由 JDOM 使用,所以包括它是为了确保 JDOM 可以即装即用。同一原则适

用于 JAXP,但并未明确公布:JAXP 附带解析器是为了可以立即使用。但是,许

多人将 Sun 的解析器中包括的类作为 JAXP API 本身的一部分。例如,新闻组

上的常见问题通常是“我如何使用 JAXP 附带的 XMLDocument 类?它的作用是

什么?”答案有些复杂。

软件包名称中是什么?

当我第一次在 Java 1.5 中贸然打开源代码时,我惊奇于我所看到的 —— 或者

更应该说是我

没有

看到的。没有在正常中的软件包 中找到

Xerces,因为 Sun 将 Xerces 类重新分配给了

al。(我发现这有点不正常,但没有人问我。)

在任何情况下,如果您在 JDK 中查找 Xerces,就能找到它。

首先,ument 类不是 JAXP 的一部分。它是 Sun 的

Crimson 解析器的一部分,包装在 JAXP 的早期版本中。所以这个问题从一开始

就令人误解。其次,JAXP 的主要用途是在处理解析器时提供开发商独立性。有

了 JAXP,您可以用 Sun 的 XML 解析器、Apache 的 Xerces XML 解析器和

Oracle 的 XML 解析器来处理相同的代码。因而使用特定于 Sun 的类会违反使

用 JAXP 的要点。是否弄清楚了本主题是如何变得复杂起来的?JAXP 发行版中

的 API 和解析器 已经组合在一起,一些开发人员误将解析器中的类和特性作为

API 的一部分,反之亦然。

既然弄清楚了所有的混淆,那么您就可以深入了解一些代码和概念了。


本文标签: 解析器 处理 提供 解析 使用