`
mmdev
  • 浏览: 13245860 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Sun 的 Java 和 XML API:孰功孰过?

 
阅读更多
作者:Brett D. McLaughlin, Sr. (brett@newInstance.com), 作家兼编辑, O'Reilly Media, Inc.

Brett McLaughlin 从 Logo 时代就开始使用计算机。(还记得那个小三角吗?)近年来他已经成为 Java 技术和 XML 社区最知名的作家和程序员之一。他曾经在 Nextel Communications 实现过复杂的企业系统,在 Lutris Technologies 编写应用程序服务器,最近在 O'Reilly Media, Inc. 继续撰写和编辑这方面的图书。在他的新书 Head Rush Ajax 中,Brett 与畅销书作家 Eric 及 Beth Freeman 为 Ajax 带来了获奖的创新方法 Head First。他的上一本书 Java 1.5 Tiger: A Developer's Notebook 是第一本可获得的关于最新版本 Java 技术的书籍,而他的经典著作 Java and XML 仍然是在 Java 语言中使用 XML 技术的权威图书。



回顾古老的 JAXP

对于刚接触 Java 和 XML 的程序员(或者通过 Sun 和 J2SE 才接触到 XML 的程序员)来说,都有必要简要回顾一下早期的 JAXP。那时,JAXP 是 Java 和 XML 领域中排行第三的 API,风靡程度仅次于 SAX(Simple API for XML)和 DOM(Document Object Model)。JAXP 的目标非常简单:使 SAX 和 DOM 的使用更加简单,尤其是在供应商中立领域。

JAXP 是一个包装器 API

最初,JAXP 的目的仅仅是向 SAX 和 DOM 提供便利性和供应商中立性。根据这一点,JAXP 从未想过要替代 SAX 或 DOM;事实上,JAXP 在其早期版本中拥有一些方法,getXMLReader() 和 getDOMParser() 就是其中的两个。 显而易见,这些方法的存在表明 JAXP 的作者希望 开发人员使用 JAXP,然后操作底层的 SAX 和 DOM 实现类。

还有一点值得注意,虽然 JAXP 在这些年中不断地加入大量的功能,但是这两个方法从未修改过。有的人会说这不过是出于向后兼容性的考虑,不过这确实反应了 JAXP 从未打算将 SAX 或 DOM 取而代之。JAXP 只不过是将它们封装起来,这样开发人员就不必使用大量特定于供应商的代码来调用 SAX 或 DOM了。

JAXP 提供了供应商中立性

在早期的 Java 和 XML 编程中,存在大量 的 XML 解析器(最初的 Xerces 和 XML4J,Sun 公司的 Crimson,Oracle 公司的 XML 解析器,以及一些如今人们从未听过的解析器。)当我们编写一个与 XML 协作和交互的应用程序时,需要将 SAX 和 DOM API 连接到这些解析器实现,通常所使用的方法是将解析器类名告知 SAX 或 DOM,有点类似如下的方式:


Parser parser = new org.apache.xercers.parsers.SAXParser();


注意:我有意使用了较旧的 SAX Parser 接口;它是旧的 SAX 1 解析类,在 JAXP 成为问题的时期所有人都在使用它。

JAXP 引入了一个 javax.xml.parsers.SAXParserFactory 系统属性,它允许我们指定解析器工厂实现(工厂中提供了想要使用的解析器)。可以通过一个 System.setProperty() 系统属性指定工厂,也可以通过某些位置下的 jaxp.properties 文件来指定(本质上说,即应用程序类路径中的任何位置)。

无论采用何种方式指定这一属性 — 或者其对应的 DOM 属性 javax.xml.parsers.DocumentBuilderFactory — 都需要避免在解析代码中出现任何类名。这也是 JAXP 存在的首要原因:防止将此类信息直接放入代码。可以通过改变属性值来方便地修改各种属性,或者甚至建立多个 jaxp.properties 文件用于不同的解析器实现,并且在需要时对它们进行切换。



JAXP 现状

对于 Sun 公司推出 JAXP 的最初目的,您可以执有自己的看法,甚至可以否定其价值,但是此时这已经没有什么实际意义了。真正具有现实意义且值得讨论的是:JAXP 如今的角色是什么?以及人们正在如何使用它?如今,所有的 Java 发行版毫无例外的将 JAXP 囊入其中,显然 Java EE(J2SE and Java Platform, Enterprise Edition 5)、Java Platform 和 Java ME(Java ME)不包括在内,大约 95% 的 Java 和 XML 开发人员都在使用 JAXP。

JAXP 作为 SAX 和 DOM 的替代

随着时间的推移,JAXP 已不再封装 SAX 和 DOM,而是在逐步取代它们。现在我们需要记住,JAXP 本身并不是一个真的解析 API(在需要 SAX 或 DOM 解析器运作的情况下)。因此 JAXP 永远都无法从功能上取代 SAX 或 DOM;然而,它可以在实际应用中 取代它们,开发人员完全可以停止使用 SAX 包(org.xml.sax)或 DOM 包(org.w3c.dom)中的方法或类。

要验证这点,其中一个方法就是询问开发人员。因为 Sun 公司在促销(可以这样理解)自己的 API,而且 JAXP 与当前版本的 Java 技术 “绑” 在了一起,所以许多开发人员都是通过 JAXP 接触 XML 的。自然而然,他们开始学习使用 JAXP,甚至大多数已经牢固掌握 SAX 和 DOM 的开发人员也觉得 JAXP 更加好用。事实上,许多开发人员都完全没有意识到 SAX 和 DOM 是 JAXP 的基础!

所有这些使 SAX 和 DOM 在 JAXP 的光彩下逐渐离开人们的视线。对 ContentHandler 和 DOMImplementation 的谈论已成了昨日黄花,或者至少是相当高端的 Java 和 XML 程序员才会知道这些。这甚至与 5 年之前的相互抗衡的情形迥然不同,那时 JAXP 仍处于演化和起步阶段,除了 JAXP 之外开发人员通常至少会对 SAX 和 DOM 中的一种偏爱有加(许多情况下是两种)。

是添加了更多功能,还是维持原状?

然而,比起相互抗衡更加重要的一点是:甚至有人只 使用 JAXP — 而不是直接使用 SAX 和 DOM,或使用 JAXP 附带的那些 API — 这极大地限制了 XML 编程和解析功能。因为 JAXP 确实只是一个包装器 API(无论人们如何使用它),它无法使用 SAX 和 DOM 提供的任意选项。虽然我们可以在 JAXP 上设置解析器的特性和属性,并能处理内容和基本的错误处理,不过 SAX 尤其提供了大量的与语法相关的事件(DTD 和模式)和更高级的词法事件(如处理指令)。访问这些事件的惟一方式是直接操作 SAX XMLReader 接口。

请记住,我并不提倡将 JAXP 一棒子打死。我们可以将 JAXP 用作它的原始目的 — 访问解析器,而不必直接处理代码中的供应商解析器类 — 然后使用 JAXP 的 getXMLReader() 访问获取 SAX XMLReader 接口。这样,便可以轻松地直接操作 SAX — 但是所有这些需要我们首先了解如何操作 XMLReader 接口。

所有这些,我们可以看出 JAXP 表面是添加了一些功能 — 供应商中立性,一些便利性和帮助器方法 — 但是实际上可以移除这些内容。如果开发人员过分依赖于 JAXP(这已经成为了目前的问题),那么他们将非常容易忘记或甚至没有意识到 JAXP 并未公开 SAX 和 DOM 中的大量功能。因此,虽然 JAXP 本来是用于提供功能,但是它实际上减少了 Java 和 XML 程序员的工具。

开放源码问题?

我将这个问题留在最后讨论,其主要原因是它涉及到道德、合法性和各种会让大多数程序员觉得枯燥和无聊的内容。而且这似乎还不够,开放源码还将哲学牵扯进 来。总之,我想知道 Sun — 虽然一直将法律放在首位 — 是否没有违反法律精神(开放源码和社区方面)。当他们将 SAX API 作为基石,然后开始在 JAXP 中添加功能,我想知道他们为什么没有将这些功能融入到 SAX 中去?在 JAXP 中添加方法调用这些新功能(就是他们的大多数 API)也是完全可行的。但是这些功能就不能作为整体提交给 SAX API 吗?

事实上,如果 JAXP 的实用性是与 Sun 希望我们相信的那样(说实话,我没有必要讨论其实用性),那么为什么他们不将这些功能提供给我们。我们至少有时会倾向于单独使用 SAX,而不需要 JAXP。为了避免任何可能的混乱,我们仍然会选择使用 Java 技术,因此 Sun 公司通过 SAX(而不仅仅是 JAXP)将这些功能提供出来并不会失去任何业务(这甚至是一个笑话,就像 Sun 不再卖 Java 技术)。还有,这个问题虽然相当细微,但是却值得思考:如果 JAXP 提供了如此巨大的价值,难道其中一些价值就不能分给底层的 API 吗?JAXP 将仍然受益于在 SAX 和 DOM 之间轻易转换,不过对于 XML 社区来说将会是一个很大的欣喜。

结束语

我并不想在这里发表激昂的言论(不过我不会介意一些读者在 讨论论坛 上这样做),但是我仍然要质疑 JAXP — 和其他一些同一性质的 Sun API — 以及它从一个包装器 API 演化成为 “全能” 解析器 API。我认为 JAXP 埋没了 SAX 和 DOM 自身的价值,却没有换回任何有意义的价值。我很乐意 Sun 将 JAXP 作为针对供应商中立的一个封装层,并将解析方法和行为稳固地留在 XML 解析器和 API 供应商的领土中。


当然,Sun 公司并未向我致电征求我的意见,而且 Scott McNealy 肯定也从未听过我的名字,因此对于 Sun 的做法我们也无能为力。然而,设想如果您是一名 Java 和 XML 程序员,这至少会让您对 JAXP 的使用产生疑问 — 这就是他们的意图。如果程序员还要(重新)学习 SAX 和 DOM 的话,我们就会明智地开始使用 JAXP,事实上是为了更好地编写应用程序,因为我们能够在较低等级操作 XML 文档,而且能够更加游刃有余。然后,甚至连 Scott 都会注意到我们所编写的优秀应用程序,难道不是吗?因此您告诉我:这有什么意义吗?
分享到:
评论

相关推荐

    dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。下载地址 .txt

    dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以...

    JAVA_完完全全的中文版Java API_Sun公司官方出版

    Java API包含了大量预先编写好的类和接口,这些类和接口覆盖了输入输出、网络通信、图形用户界面(GUI)、数学计算、数据结构、多线程、数据库连接、XML处理等多个领域。通过使用Java API,开发者可以极大地提高开发...

    jdk10+ java.lang.NoClassDefFoundError: javax/xml/ws/Service 错误

    - `jaxws-rt`:Java API for XML Web Services运行时库,提供了Web服务客户端和服务器端的实现。 在Maven的`pom.xml`文件中添加如下依赖: ```xml <groupId>javax.activation <artifactId>javax....

    Sun 的 Java API for XML 语法分析

    Java API for XML Processing,简称JAXP,是Sun Microsystems推出的一种用于处理XML的Java接口,旨在为XML解析提供一种统一的、与供应商无关的访问方式。JAXP并不直接进行XML解析,而是作为一个抽象层,使得开发者...

    Java™ API for XML

    1. Java XML API:Java XML API是用于处理XML(可扩展标记语言)文件的一系列Java API。它允许Java程序读写和操纵XML数据,使得Java程序能够创建、解析、打印和修改XML文档。这些API通常被集成到Java标准版(J2SE)...

    JAXP 专述――Sun 的 Java API for XML 语法分析

    《深入解析JAXP:Sun的Java API for XML解析》 在探讨JAXP(Java API for XML Processing)这一主题时,我们需首先明确其在Java与XML领域中的定位与价值。JAXP并非旨在革新XML处理的方式,也不提供额外的语法分析...

    java和xml相关的技术电子书

    3. Java与XML的结合:Java提供了多种API来处理XML,如DOM(文档对象模型)、SAX(简单API for XML)和DOM4J等。DOM将整个XML文档加载到内存中形成一棵树形结构,适合小规模数据处理;SAX是事件驱动模型,只在解析时...

    JAVA与XML程序开发

    7. **XML文件的处理和操作**:Java标准库中的`javax.xml`和`org.w3c.dom`包提供了处理XML文件的API,包括创建、修改、读取和验证XML文档。 8. **XML数据库(如eXistDB)**:Java也可以用来开发和访问XML数据库,...

    javax.xml.bind jdk1.5缺包

    `javax.xml.bind`是Java中的一个标准API,主要用于XML数据绑定,它允许Java对象和XML文档之间进行互操作。`com.sun.xml.bind.v2.ContextFactory`是这个模块的核心类,负责生成和管理Java对象与XML之间的绑定上下文。...

    Java,XML和Web服务宝典

    《Java, XML和Web服务宝典》是一本深入探讨Java编程、XML技术以及Web服务的综合性书籍,旨在帮助读者全面掌握这些关键技术,并将其应用于实际开发中。以下将详细阐述其中涉及的重要知识点: **Java** Java是一种...

    Java通过XML Schema校验XML

    然而,Java中处理XML及其实现XSD校验的过程并不直观,尤其是当涉及到Sun提供的XML相关软件包时。这是因为W3C为XML定义了大量的规范,这使得学习和理解相关的API变得异常困难。此外,随着新规范的不断推出,掌握所有...

    Java+XML日程提醒系统Java源码

    Java提供了多种处理XML的API,如DOM(Document Object Model)、SAX(Simple API for XML)和JAXB(Java Architecture for XML Binding)。DOM一次性加载整个XML文档到内存,适合小型文档;SAX是事件驱动的,适用于...

    java开发相关api文档

    8. **XML处理**:JAXP(Java API for XML Processing)提供了解析XML、转换XML和验证XML文档的API,位于`javax.xml.transform`、`javax.xml.parsers`等包中。 9. **其他扩展库**:Java API还包括许多其他扩展库,如...

    JAVA8 完整源码(包含Sun包源码)

    3. **日期与时间 API**:在 `java.time` 包中,Java 8 提供了新的日期和时间API,取代了旧的 `java.util.Date` 和 `java.util.Calendar`。这些新类如 `LocalDate`, `LocalTime`, `LocalDateTime` 和 `ZonedDateTime`...

    stax2-api:Stax扩展API,Java拉解析API(针对Xml的Streaming Api)

    此外,Stax2 API包含包装器实现,可用于支持常规Stax实现(如Sun SJSXP)(与JDK 1.6和1.7捆绑在一起的默认Stax实现)上的大多数API。 Java包 API类位于org.codehaus.stax2包中。 Stax2 API还包含许多API类的局部...

    IBM SUN JDK XML解析相关

    IBM JDK和SUN JDK在XML解析上的主要组件包括DOM(Document Object Model)、SAX(Simple API for XML)和JAXB(Java Architecture for XML Binding)。这些组件分别对应于不同的解析策略,DOM以树形结构存储整个XML...

    Java XML绑定技术 (Castor JAXB XMLBeans)

    使用JAXB,可以通过简单的API调用来序列化和反序列化Java对象为XML文档,反之亦然。 **特点:** - **简单易用**:只需在Java类上添加一些注解,即可实现对象与XML之间的转换。 - **灵活性高**:支持自定义XML结构,...

Global site tag (gtag.js) - Google Analytics