JDOM 是一种使用 xml 的独特 java 工具包,用于快速开发 XML 应用程序。它的设计包含 Java 语言的语法乃至语义。但是它是否比现有的 -- 更标准的 -- XML API 好呢?当我们看过一些示例并说明这个流行的开放源代码项目的设计目标后,您自己来判定吧。最近这个开放源代码项目已被正式接受成为 Java 规范要求。
当然,软件产品和标准并不总是根据 80-20 规则发展的。非凡的,Java XML 的缺陷就是这条规则的一个例外。Java 的编程世界拥有很多的 API -- 一些是自己开发的,一些是由几个大公司开发并被制定为标准的 -- 他们提供了解决非凡 XML 任务的成熟解决方案。作为 XML 普遍性的证实,每个新任务都存在着一种新技术,但如何将它们结合在一起,又如何寻找一种合适的工具去完成必须重复做的任务中的 80% -- 利用 Java 语言的直观映象的基本 XML 树操作?JDOM 正好是用来解决上述问题的一个 XML API。
标记:Java 和 XML 在许多方面,Java 语言已变成供 XML 选择的一种编程语言。由于 Apache 软件基金会和 IBM alphaWorks 所做的开创性工作,现在已有完整的工具链用于创建,操作,传送文档和对 XML 文档进行语法分析。
但是,虽然许多 Java 开发人员天天都在使用 XML,Sun 却在将 XML 整合进 Java 平台方面落后了。因为在 XML 成为从商家对商家集成到 Web 站点内容流水化等方面的要害技术之前,Java 2 平台就已经非常流行了。Sun 已经使用 JSR 过程使之成为现存 XML API 的鼻祖,这一点已被广泛接受。目前最显著的是加入了 JAXP (用于 XML 语法分析的 Java API),其中包含了三个软件包:
org.w3c.dom,W3C 推荐的用于 XML 标准规划文档对象模型的 Java 工具 org.xml.sax,用于对 XML 进行语法分析的事件驱动的简单 API javax.xml.parsers,工厂化工具,答应应用程序开发人员获得并配置非凡的语法分析器工具 尽管对于 Java 开发人员而言,有了这些软件包是件好事,但它仅仅代表获得了现有 API 标准的正式许可而已,并没有在提供一流的 Java-XML 互操作性方面取得了巨大飞跃。核心 Java 平台所缺乏的是将 XML 文档作为 Java 对象操作的直观接口。
这是 JDOM 适合的 API、哑元 JDOM 能够替换 org.w3c.dom 软件包来有计划地操作 XML 文档。它并不是一个简单的替代品,实际上 JDOM 和 DOM 能够愉快地并存。另外,尽管它提供的类的封装从配置和运行分析器执行中分担了大量工作,但它不负责根据文本输入来对 XML 进行语法分析。JDOM 建立在现有的 API 的能力之上,正如项目网页所表述的“一个更好的捕鼠器”。
要理解需要备用 API 的原因,就要考虑 W3C DOM 设计的局限性:
语言独立。DOM 并不是用人们心目中的 Java 语言设计的。虽然这种方法保留了在不同语言中非常相似的 API,它也使那些习惯 Java 语言的程序员感到更麻烦。例如:Java 语言内建了一种 String 类,而 DOM 则规范定义了自己的 Text 类。
严格的层次结构。DOM API 直接沿袭了 XML 规范。在 XML 中,每件东西都是一个结点,因此您能在 DOM 中找到一个几乎每件东西都可以扩展的基于 Node 的接口和返回 Node 的一系列方法。就多态性的观点来讲,它是优秀的,但鉴于如上解释,它在 Java 语言中的应用是困难而且不便的,其中从 Node 向叶类型作显式下拉会导致代码的冗长和难以理解。
接口驱动。公共 DOM API 仅由接口组成(Exception 类是一个例外,但恰恰足够了)。w3c 对提供实现并不感爱好,它只对定义接口(比较有意义)感爱好。但它也意味着作为 Java 程序员使用 API 在创建 XML 对象时增加了分散程度,因为 w3c 标准大量使用工厂化的类和类似的灵活的但不直接的模式。在某些应用中,XML 文档是仅由语法分析器建立的,而从不会由应用程序级代码建立,这是不相关的。但是,随着 XML 更广泛的使用,并不是所有问题都继续需要由语法分析器来驱动。应用程序的开发人员需要一个更方便的方法有计划地构造 XML 对象。 对于程序员,这些约束意味着庞大(在内存占用和接口大小方面)的和难把握的 API,学习和使用都很难。相反,JDOM 是作为一种轻量级 API 被制定的,最主要的是它是以 Java 为中心的。它在遵循 DOM 主要规则的基础上除去了上述缺点:
// Make the input sources for the XML and XSLT documents org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter(); org.w3c.dom.Document domDocument = outputter.output(myDocument); javax.xml.transform.Source xmlSource = new javax.xml.transform.dom.DOMSource(domDocument); StreamSource xsltSource = new StreamSource(new FileInputStream("/some/directory/car.xsl"));
// Make the output result for the finished document using // the HTTPResponse OutputStream StreamResult xmlResult = new StreamResult(response.getOutputStream());
// Get a XSLT transformer Transformer transformer = tFactory.newTransformer(xsltSource);
// Do the transform transformer.transform(xmlSource, xmlResult);
在短短几行代码中,JDOM 启用了许多功能,我们已经在 XML 中分析过并有计划地创建了 XML 文档,操作了那些文档,并使用它们产生 XML 驱动的 Web 页面。
Sun 和 JDOM:名字里包含了些什么? JDOM 的 1.0 正式发行版可能与其在 Java Community Process 中的一贯发展方向相符。作为 JSR-102 提交的 JDOM 已经批准成为了核心 Java 平台的最终包含部分。Sun 对此的评价是:“JDOM 确实明显地比早期的 API 更易于使用,因此我们相信它将成为 Java 平台有用的附加物。”据 JSR 透露,JDOM 1.0 发行版的包装可能由 "org.jdom" 变为 "javax.xml"。尽管前景乐观,但开发人员可能最终不得不改变他们的代码来使用新代码。 JDOM 的成长:前景一瞥 正如此文所提的那样,JDOM 项目已经发布了它的 Beta 6 版本。甚至在 beta 状态下,对于许多真实世界中的实现方法来说,JDOM 已经被证实是稳定的一种了。尽管大部分的 API 已经稳固了,但在一些领域中仍在进行一些会对现有的接口造成潜在影响的工作。因此,在这点上,任何在进行的开发项目都不需要因为害怕一个错误多多的实现方法而回避 JDOM,但是要考虑这样一个事实:某些方法结构或某些语义仍有可能在最终发布和被核心 Java API 所采用之前发生改变。(请参阅名字里包含了些什么?)
JDOM 紧接着要做的是致力于稳定 API 并对实现方法的各方面性能问题作出评估。其它方面有所进展,但也造成了对一些应用程序开发人员的阻碍,包括支持 DTD 实体和其它不太常见的构造。沿着这条路再进一步就是对 XPATH(它是一种象 XSLT 这样的应用程序所特有的 XML 路径语言)的核心支持以及更多地集成 XML 数据源。
那么,概况地说,JDOM 是否比现有的 XML API 好呢?假如您梦想 Java,那答案可能是“是的”。JDOM 并非意味着将取代您所喜爱的语法分析或 XML 敏感型数据库,但其设计原则有助于为试图把握 XML 世界的新老 Java 开发人员提供快速的学习途径。
如想获得有关 Xalan、Xerces 和其它 Java XML 产品的更多信息,请访问 Apache XML 网站。
请访问 XML 网站,获取一般 XML 信息、教程和资源。
请不要忘记 developerWorks XML 专区,那儿有大量和 XML 有关的内容。
IBM 的 alphaWorks 网站为 Java 和 XML 开发人员提供了几个工具: XML Parser for Java 包含了对 DOM 级别 1 和 SAX 级别 1 规范的公开的和稳定的支持。 为了诊断对 XML Schema 语言的不正确使用,请尝试 XML Schema Quality Checker。 XML Security Suite 提供了多种安全性功能,例如数字签名、元素式的加密和访问控制。 利用 XSL Editor 来测试和编辑您的 XSL。
IBM XML parser for Java (XML4J) 是一个控制 XML 文档的便利工具。“使用 IBM XML 分析器”会教您它的用法。(IBM PartnerWorld for Developers,2000 年 1 月)
William Phillips 和 Gary Cole 所撰写的“控制 DOM”(developerWorks,2001 年 4 月)向 Java 开发人员介绍了 DirectDOM。
请参加面向 Java 开发人员的 developerWorks XML 工具和 API 讨论。
这儿有更多有关使用 DOM 来把 XML 文档整合入应用程序的更多信息。
请看 MegObjectExamplePlugin 如何把 Web 页面转换成“低媒体”页面。 关于作者 Wes Biggs 已经为包括 Los Angeles Times、USWeb 和 Elite Information Systems 在内的一些公司开发了因特网应用。他经常为开放源代码 Java 项目撰稿,并维护着自由软件基金的 gnu.regexp 的定期发布包。可通过 wes@tralfamadore.com 联系 Wes。
Harry Evans 在软件设计和应用工程方面的经验包括大多数在启动环境中的几个基于 Web 和因特网敏感型的产品的设计。他涉足过产品生命周期的所有阶段,从快速应用开发到传统产品集成。可通过 harry@tralfamadore.com 联系 Harry。