Java 和 XML 的组合,是 21 世纪软件开发人员的圣杯。没有任何程序语言比 Java 更具吸引力,而 XML 提供了绝佳的资料表达方式,Java 和 XML 个别来看都是很有用的工具,而两者结合起来的威力更是让程序员兴奋地逢人就说。但是,在尝试着将 Java 和 XML 结合起来用到自己的工作上时,这些程序员又很轻易就不知所措。
在本篇文章中,我们将告诉你,为什么对 Java 程序员来说 XML 使用上不如预期的轻易,我们也会告诉你,最近有哪些关于 Java 和 XML 上的支持出现,使得这一切变简单了。
难道 XML 是 eXPert Markup Language(给专家使用的标记语言)?
基于对 XML 的兴奋与爱恋,Java 程序员往往迫不及待就到 W3C 的网站上阅读 XML 规格书。在他们浏览 XML 规格书的时候,计算机上同时执行着 Java 程序编辑软件,因为他们预备马上敲进一些东西试试看,然后,很快地,XML 复杂的语法以及晦涩的观念却让他们的心头涌上一阵恐慌。XML 根本不如他们所预期的简单。
XML 规格绝对不是一般 Java 程序员习惯看的格式!所以他们等待,希望藉由更多 XML 新语法和新规格(XSL、XML namespaces、Xpath... 等)的发展可以使得它更简单。他们等待 Java 的 XML API。
API 的演进
一些程序员设计出一些符合 XML 规格的 API,用来帮助他们同伴使用 XML。他们辛劳的初期成果是 SAX 和 DOM。
SAX
SAX 的全名是 Simple API for XML。SAX 是由一个名为 XML-dev 的 mailing list 所发展出来的(XML-dev 是一群志同道合的 XML 高手所组成),SAX 可将 XML 文件用循序的方式列出,SAX 也定义了剖析 XML 文件会发生的许多事件,比方说:element 开始、element 结束、出现字符数据、DTD 定义 entity...... 等。事件发生时,SAX 剖析程序会呼叫对应的 callback method。程序员可以自行定义这些 callback method 的内容,以对此事件做出适当的反应,并答应程序使用这些 XML 的资料。程序员从 David Megginson 的网站下载 API 回来就可以开始写 SAX 程序了,他们也就很快地将 XML 用到日常工作上。
然而,这还不够。虽然 SAX 执行起来很快(因为 SAX 不需要将整个 XML 文件同时放在内存),但是却也无法修改 XML 资料,而且一般对象导向程序员也比较不熟悉 SAX 所采用的 callback 事件处理方式,经常会用得不恰当。程序员对 SAX 不满,再度寻觅一个更好的 API,他们找到了 DOM。
DOM
DOM 的全名是 Document Object Model。Java 版的 DOM 提供了一个和 XML 文件不同的外观。基本上 DOM 的文件是一个 tree,你可以任意地存取、修改这个由 XML 文件所形成的 DOM tree。SAX 所采用的循序、事件式的处理方式,在 DOM 引进对象导向观念后得到了平衡。对 DOM 来说,每个项目都是特定型态的节点,都继续自 Node 接口。常见的节点有 Document、Text、Element、以及 Attribute 等,这些节点都可以有子节点,XML 文件可以构成一棵完整的 DOM tree。Java 程序员只要到 W3C 下载 DOM 回来即可使用 DOM。XML 再度被用到 Java 程序中,程序员比较能接受此 API,而且用得凶。
但是,想使用 DOM,仍然必须全盘了解 XML,逼得程序员还是得回去了解 XML 的规格书(不过 www.xml.com 有一个注释版的文件,较易 阅读),逼得他们去学一些一般程序用不着的概念,比方说:entities、namespaces、以及处理指令(processing instrUCtion)。再者,DOM 要求树状图必须整体在内存中, 使得 Java 程序的效能变差,所以不少程序员不是回去使用 SAX,就是决定再等一等。
JAXP
有了 Sun 所设计的 JAXP(全名是 Java API for XML Parsing),Java 版本的 XML API 终于开始正视到一个重要的事实:许多 Java 程序员只希望让程序兼容于 XML,但不想把 XML 的规格读到滚瓜烂熟。JAXP 让你可以利用简单的方式来获得一个 DOM Document 或 SAX 剖析器,因此程序员不用再为不同厂商的不同版本大伤脑筋。JAXP 也意图让你的程序只需小修改就可换成其它厂商的实作版本。这才是程序员习惯的方式。
然而,JAXP 只是让底下的实作可以交换,整个 JAXP 还是建构在 DOM 和 SAX 这两个不太好用的 API 上。因为它支持旧版的 API(SAX 1.0 与 DOM Level 1),所以造成一些 不方便的限制。
JDOM
JDOM(Java Document Object Model)是一个新的 API,用来提供 Java 程序处理 XML 的能力。更重要的是:它还是第一个明确地针对 Java 程序员所设计用来处理 XML 的 API,这也意味着它符合一般 Java 程序员的期待、习惯、和希望。此 API 不要求程序员一板一演地操作树状结构,而是,比方说,直接的操作某 Element。