JDOM 是一種使用 xml 的獨(dú)特 java 工具包,用于快速開發(fā) XML 應(yīng)用程序。它的設(shè)計(jì)包含 Java 語(yǔ)言的語(yǔ)法乃至語(yǔ)義。但是它是否比現(xiàn)有的 -- 更標(biāo)準(zhǔn)的 -- XML API 好呢?當(dāng)我們看過(guò)一些示例并說(shuō)明這個(gè)流行的開放源代碼項(xiàng)目的設(shè)計(jì)目標(biāo)后,您自己來(lái)判定吧。最近這個(gè)開放源代碼項(xiàng)目已被正式接受成為 Java 規(guī)范要求。
當(dāng)然,軟件產(chǎn)品和標(biāo)準(zhǔn)并不總是根據(jù) 80-20 規(guī)則發(fā)展的。非凡的,Java XML 的缺陷就是這條規(guī)則的一個(gè)例外。Java 的編程世界擁有很多的 API -- 一些是自己開發(fā)的,一些是由幾個(gè)大公司開發(fā)并被制定為標(biāo)準(zhǔn)的 -- 他們提供了解決非凡 XML 任務(wù)的成熟解決方案。作為 XML 普遍性的證實(shí),每個(gè)新任務(wù)都存在著一種新技術(shù),但如何將它們結(jié)合在一起,又如何尋找一種合適的工具去完成必須重復(fù)做的任務(wù)中的 80% -- 利用 Java 語(yǔ)言的直觀映象的基本 XML 樹操作?JDOM 正好是用來(lái)解決上述問(wèn)題的一個(gè) XML API。
標(biāo)記:Java 和 XML 在許多方面,Java 語(yǔ)言已變成供 XML 選擇的一種編程語(yǔ)言。由于 Apache 軟件基金會(huì)和 IBM alphaWorks 所做的開創(chuàng)性工作,現(xiàn)在已有完整的工具鏈用于創(chuàng)建,操作,傳送文檔和對(duì) XML 文檔進(jìn)行語(yǔ)法分析。
但是,雖然許多 Java 開發(fā)人員天天都在使用 XML,Sun 卻在將 XML 整合進(jìn) Java 平臺(tái)方面落后了。因?yàn)樵?nbsp;XML 成為從商家對(duì)商家集成到 Web 站點(diǎn)內(nèi)容流水化等方面的要害技術(shù)之前,Java 2 平臺(tái)就已經(jīng)非常流行了。Sun 已經(jīng)使用 JSR 過(guò)程使之成為現(xiàn)存 XML API 的鼻祖,這一點(diǎn)已被廣泛接受。目前最顯著的是加入了 JAXP (用于 XML 語(yǔ)法分析的 Java API),其中包含了三個(gè)軟件包:
org.w3c.dom,W3C 推薦的用于 XML 標(biāo)準(zhǔn)規(guī)劃文檔對(duì)象模型的 Java 工具 org.xml.sax,用于對(duì) XML 進(jìn)行語(yǔ)法分析的事件驅(qū)動(dòng)的簡(jiǎn)單 API javax.xml.parsers,工廠化工具,答應(yīng)應(yīng)用程序開發(fā)人員獲得并配置非凡的語(yǔ)法分析器工具 盡管對(duì)于 Java 開發(fā)人員而言,有了這些軟件包是件好事,但它僅僅代表獲得了現(xiàn)有 API 標(biāo)準(zhǔn)的正式許可而已,并沒(méi)有在提供一流的 Java-XML 互操作性方面取得了巨大飛躍。核心 Java 平臺(tái)所缺乏的是將 XML 文檔作為 Java 對(duì)象操作的直觀接口。
這是 JDOM 適合的 API、啞元 JDOM 能夠替換 org.w3c.dom 軟件包來(lái)有計(jì)劃地操作 XML 文檔。它并不是一個(gè)簡(jiǎn)單的替代品,實(shí)際上 JDOM 和 DOM 能夠愉快地并存。另外,盡管它提供的類的封裝從配置和運(yùn)行分析器執(zhí)行中分擔(dān)了大量工作,但它不負(fù)責(zé)根據(jù)文本輸入來(lái)對(duì) XML 進(jìn)行語(yǔ)法分析。JDOM 建立在現(xiàn)有的 API 的能力之上,正如項(xiàng)目網(wǎng)頁(yè)所表述的“一個(gè)更好的捕鼠器”。
要理解需要備用 API 的原因,就要考慮 W3C DOM 設(shè)計(jì)的局限性:
語(yǔ)言獨(dú)立。DOM 并不是用人們心目中的 Java 語(yǔ)言設(shè)計(jì)的。雖然這種方法保留了在不同語(yǔ)言中非常相似的 API,它也使那些習(xí)慣 Java 語(yǔ)言的程序員感到更麻煩。例如:Java 語(yǔ)言內(nèi)建了一種 String 類,而 DOM 則規(guī)范定義了自己的 Text 類。
嚴(yán)格的層次結(jié)構(gòu)。DOM API 直接沿襲了 XML 規(guī)范。在 XML 中,每件東西都是一個(gè)結(jié)點(diǎn),因此您能在 DOM 中找到一個(gè)幾乎每件東西都可以擴(kuò)展的基于 Node 的接口和返回 Node 的一系列方法。就多態(tài)性的觀點(diǎn)來(lái)講,它是優(yōu)秀的,但鑒于如上解釋,它在 Java 語(yǔ)言中的應(yīng)用是困難而且不便的,其中從 Node 向葉類型作顯式下拉會(huì)導(dǎo)致代碼的冗長(zhǎng)和難以理解。
接口驅(qū)動(dòng)。公共 DOM API 僅由接口組成(Exception 類是一個(gè)例外,但恰恰足夠了)。w3c 對(duì)提供實(shí)現(xiàn)并不感愛(ài)好,它只對(duì)定義接口(比較有意義)感愛(ài)好。但它也意味著作為 Java 程序員使用 API 在創(chuàng)建 XML 對(duì)象時(shí)增加了分散程度,因?yàn)?nbsp;w3c 標(biāo)準(zhǔn)大量使用工廠化的類和類似的靈活的但不直接的模式。在某些應(yīng)用中,XML 文檔是僅由語(yǔ)法分析器建立的,而從不會(huì)由應(yīng)用程序級(jí)代碼建立,這是不相關(guān)的。但是,隨著 XML 更廣泛的使用,并不是所有問(wèn)題都繼續(xù)需要由語(yǔ)法分析器來(lái)驅(qū)動(dòng)。應(yīng)用程序的開發(fā)人員需要一個(gè)更方便的方法有計(jì)劃地構(gòu)造 XML 對(duì)象。 對(duì)于程序員,這些約束意味著龐大(在內(nèi)存占用和接口大小方面)的和難把握的 API,學(xué)習(xí)和使用都很難。相反,JDOM 是作為一種輕量級(jí) API 被制定的,最主要的是它是以 Java 為中心的。它在遵循 DOM 主要規(guī)則的基礎(chǔ)上除去了上述缺點(diǎn):
您會(huì)注重到對(duì)于 license 元素,我們不但添加了元素的內(nèi)容,還為其添加了一個(gè)屬性,表明許可已被發(fā)出了這個(gè)狀態(tài)。這是因?yàn)?nbsp;Element 的 addContent 方法總是返回 Element 本身,而不是一個(gè)無(wú)效的聲明。
用同樣的方法添加注釋部分或其它標(biāo)準(zhǔn) XML 類型:
清單 7. 添加一條注釋 carElement.addContent(new Comment("Description of a car"));
操作文檔也是用類似方式。例如,要引用 year 元素,我們使用 Element 的 getChild 方法:
清單 8. 訪問(wèn)子元素 Element yearElement = carElement.getChild("year");
該語(yǔ)句實(shí)際上將返回第一個(gè)元素名為 year 的子 Element。 假如沒(méi)有 year 元素,則調(diào)用返回一個(gè)空值。注重,我們不必回溯來(lái)自任何類似于 DOM Node 接口的返回值 -- Element 的子元素就是 Element。用類似的方式,我們可把 year 元素從文檔中除去:
// 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 啟用了許多功能,我們已經(jīng)在 XML 中分析過(guò)并有計(jì)劃地創(chuàng)建了 XML 文檔,操作了那些文檔,并使用它們產(chǎn)生 XML 驅(qū)動(dòng)的 Web 頁(yè)面。
Sun 和 JDOM:名字里包含了些什么? JDOM 的 1.0 正式發(fā)行版可能與其在 Java Community Process 中的一貫發(fā)展方向相符。作為 JSR-102 提交的 JDOM 已經(jīng)批準(zhǔn)成為了核心 Java 平臺(tái)的最終包含部分。Sun 對(duì)此的評(píng)價(jià)是:“JDOM 確實(shí)明顯地比早期的 API 更易于使用,因此我們相信它將成為 Java 平臺(tái)有用的附加物。”據(jù) JSR 透露,JDOM 1.0 發(fā)行版的包裝可能由 "org.jdom" 變?yōu)?nbsp;"javax.xml"。盡管前景樂(lè)觀,但開發(fā)人員可能最終不得不改變他們的代碼來(lái)使用新代碼。 JDOM 的成長(zhǎng):前景一瞥 正如此文所提的那樣,JDOM 項(xiàng)目已經(jīng)發(fā)布了它的 Beta 6 版本。甚至在 beta 狀態(tài)下,對(duì)于許多真實(shí)世界中的實(shí)現(xiàn)方法來(lái)說(shuō),JDOM 已經(jīng)被證實(shí)是穩(wěn)定的一種了。盡管大部分的 API 已經(jīng)穩(wěn)固了,但在一些領(lǐng)域中仍在進(jìn)行一些會(huì)對(duì)現(xiàn)有的接口造成潛在影響的工作。因此,在這點(diǎn)上,任何在進(jìn)行的開發(fā)項(xiàng)目都不需要因?yàn)楹ε乱粋€(gè)錯(cuò)誤多多的實(shí)現(xiàn)方法而回避 JDOM,但是要考慮這樣一個(gè)事實(shí):某些方法結(jié)構(gòu)或某些語(yǔ)義仍有可能在最終發(fā)布和被核心 Java API 所采用之前發(fā)生改變。(請(qǐng)參閱名字里包含了些什么?)
JDOM 緊接著要做的是致力于穩(wěn)定 API 并對(duì)實(shí)現(xiàn)方法的各方面性能問(wèn)題作出評(píng)估。其它方面有所進(jìn)展,但也造成了對(duì)一些應(yīng)用程序開發(fā)人員的阻礙,包括支持 DTD 實(shí)體和其它不太常見(jiàn)的構(gòu)造。沿著這條路再進(jìn)一步就是對(duì) XPATH(它是一種象 XSLT 這樣的應(yīng)用程序所特有的 XML 路徑語(yǔ)言)的核心支持以及更多地集成 XML 數(shù)據(jù)源。
那么,概況地說(shuō),JDOM 是否比現(xiàn)有的 XML API 好呢?假如您夢(mèng)想 Java,那答案可能是“是的”。JDOM 并非意味著將取代您所喜愛(ài)的語(yǔ)法分析或 XML 敏感型數(shù)據(jù)庫(kù),但其設(shè)計(jì)原則有助于為試圖把握 XML 世界的新老 Java 開發(fā)人員提供快速的學(xué)習(xí)途徑。
如想獲得 JDOM 的最新版本、在線 API 文檔及更多信息,請(qǐng)?jiān)L問(wèn) JDOM 網(wǎng)站。
如想獲得有關(guān) Xalan、Xerces 和其它 Java XML 產(chǎn)品的更多信息,請(qǐng)?jiān)L問(wèn) Apache XML 網(wǎng)站。
請(qǐng)?jiān)L問(wèn) XML 網(wǎng)站,獲取一般 XML 信息、教程和資源。
請(qǐng)不要忘記 developerWorks XML 專區(qū),那兒有大量和 XML 有關(guān)的內(nèi)容。
IBM 的 alphaWorks 網(wǎng)站為 Java 和 XML 開發(fā)人員提供了幾個(gè)工具: XML Parser for Java 包含了對(duì) DOM 級(jí)別 1 和 SAX 級(jí)別 1 規(guī)范的公開的和穩(wěn)定的支持。 為了診斷對(duì) XML Schema 語(yǔ)言的不正確使用,請(qǐng)嘗試 XML Schema Quality Checker。 XML Security Suite 提供了多種安全性功能,例如數(shù)字簽名、元素式的加密和訪問(wèn)控制。 利用 XSL Editor 來(lái)測(cè)試和編輯您的 XSL。
IBM XML parser for Java (XML4J) 是一個(gè)控制 XML 文檔的便利工具。“使用 IBM XML 分析器”會(huì)教您它的用法。(IBM PartnerWorld for Developers,2000 年 1 月)
William Phillips 和 Gary Cole 所撰寫的“控制 DOM”(developerWorks,2001 年 4 月)向 Java 開發(fā)人員介紹了 DirectDOM。
請(qǐng)參加面向 Java 開發(fā)人員的 developerWorks XML 工具和 API 討論。
這兒有更多有關(guān)使用 DOM 來(lái)把 XML 文檔整合入應(yīng)用程序的更多信息。
請(qǐng)看 MegObjectExamplePlugin 如何把 Web 頁(yè)面轉(zhuǎn)換成“低媒體”頁(yè)面。 關(guān)于作者 Wes Biggs 已經(jīng)為包括 Los Angeles Times、USWeb 和 Elite Information Systems 在內(nèi)的一些公司開發(fā)了因特網(wǎng)應(yīng)用。他經(jīng)常為開放源代碼 Java 項(xiàng)目撰稿,并維護(hù)著自由軟件基金的 gnu.regexp 的定期發(fā)布包。可通過(guò) wes@tralfamadore.com 聯(lián)系 Wes。
Harry Evans 在軟件設(shè)計(jì)和應(yīng)用工程方面的經(jīng)驗(yàn)包括大多數(shù)在啟動(dòng)環(huán)境中的幾個(gè)基于 Web 和因特網(wǎng)敏感型的產(chǎn)品的設(shè)計(jì)。他涉足過(guò)產(chǎn)品生命周期的所有階段,從快速應(yīng)用開發(fā)到傳統(tǒng)產(chǎn)品集成。可通過(guò) harry@tralfamadore.com 聯(lián)系 Harry。