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 月)