JDOM 是一種使用 XML 的獨特 Java 工具包,用於快速開發 XML 應用程序。它的設計包含 Java 語言的語法乃至語義。但是它是否比現有的 -- 更標準的 -- XML APL 好呢?當我們看過一些示例並說明這個流行的開放源代碼項目的設計目標後,您自己來判斷吧。最近這個開放源代碼項目已被正式接受成爲 Java 規範要求。
作爲開發人員,您可能聽說過 80-20 規則,在其它領域被稱爲 Pareto 法則:一種過程或方法能適應所有可能情況的 80%,另外的 20% 則需要根據具體情況來處理。軟件開發的必然結果是:對於開發人員而言,有了給定的技術後就能非常容易地完成可能要做的工作的 80%。
當然,軟件產品和標準並不總是根據 80-20 規則發展的。特別的,Java XML 的缺陷就是這條規則的一個例外。Java 的編程世界擁有很多的 API -- 一些是自己開發的,一些是由幾個大公司開發並被制定爲標準的 -- 他們提供瞭解決特殊 XML 任務的成熟解決方案。作爲 XML 普遍性的證明,每個新任務都存在着一種新技術,但如何將它們結合在一起,又如何尋找一種合適的工具去完成必須重複做的任務中的 80% -- 利用 Java 語言的直觀映象的基本 XML 樹操作?JDOM 正好是用來解決上述問題的一個 XML API。
在許多方面,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 進行語法分析的事件驅動的簡單 APIjavax.xml.parsers
,工廠化工具,允許應用程序開發人員獲得並配置特殊的語法分析器工具
儘管對於 Java 開發人員而言,有了這些軟件包是件好事,但它僅僅代表獲得了現有 API 標準的正式許可而已,並沒有在提供一流的 Java-XML 互操作性方面取得了巨大飛躍。核心 Java 平臺所缺乏的是將 XML 文檔作爲 Java 對象操作的直觀接口。
進入 JDOM。JDOM 是兩位著名的 Java 開發人員兼作者,Brett Mclaughlin 和 Jason Hunter 的創作成果, 2000 年初在類似於 Apache 協議的許可下,JDOM 作爲一個開放源代碼項目正式開始研發,JDOM 作爲一個開放源代碼項目正式開始了。它已成長爲包含來自廣泛的 Java 開發人員的投稿、集中反饋及錯誤修復的系統,並致力於建立一個完整的基於 Java 平臺的解決方案,通過 Java 代碼來訪問、操作並輸出 XML 數據。
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 主要規則的基礎上除去了上述缺點:
- JDOM 是 Java 平臺專用的。只要有可能,API 都使用 Java 語言的內建
String
支持,因此文本值也適用於String
。它還可利用 Java 2 平臺的類集,如List
和Iterator
,給程序員提供了一個豐富的並且和 Java 語言類似的環境。
- 沒有層次性。在 JDOM 中,XML 元素就是
Element
的實例,XML 屬性就是Attribute
的實例,XML 文檔本身就是Document
的實例。由於在 XML 中所有這些都代表了不同的概念,因此它們總是作爲自己的類型被引用,而不是作爲一個含糊的“結點”。
- 類驅動。因爲 JDOM 對象就是像
Document
、Element
和Attribute
這些類的直接實例,因此創建一個新 JDOM 對象就如在 Java 語言中使用new
操作符一樣容易。它還意味着不需要進行工廠化接口配置 -- JDOM 的使用是直截了當的。