一、概述
Jdom是用java語(yǔ)言讀、寫(xiě)、操作xml的新API函數(shù)。Jason Hunter 和 Brett McLaughlin公開(kāi)發(fā)布了它的測(cè)試版本。在直覺(jué)、簡(jiǎn)單和高效的前提下,這些API函數(shù)被最大限度的優(yōu)化。在接下來(lái)的篇幅里,Hunter 和 McLaughlin介紹怎么用Jdom去讀寫(xiě)一個(gè)已經(jīng)存在的XML文檔。
Jdom是一個(gè)開(kāi)源的api,它以直接易懂的方式向java程序員描述XML文檔和文檔的內(nèi)容。就象名字揭示的那樣,Jdom是為java優(yōu)化的。為使用XML文檔提供一個(gè)低消耗的方法。Jdom的使用者可以不必把握太多的XML的知識(shí)就可以完成想要的操作。
Jdom可以和已有的XML技術(shù)如Simple API for XML (SAX)和 Document Object Model (DOM)相互協(xié)作.然而,它并不是簡(jiǎn)單的從這些api中提取出一些。Jdom從這些已存在的技術(shù)中吸收了好的方面,自己建立了一套新的類(lèi)和接口,用一個(gè)Jdom用戶(hù)的話(huà)來(lái)說(shuō)就是:“這些接口是我從一開(kāi)始閱讀org.w3c.dom就期待的”;Jdom可以讀入SAX或是DOM的內(nèi)容,也可以輸出SAX或DOM可以接收的格式。這個(gè)能力可以使Jdom很好的和已有的用SAX或DOM建立的系統(tǒng)之間整合。
第一條并且是最重要的一條就是Jdom的api函數(shù)被設(shè)計(jì)成對(duì)java程序員來(lái)說(shuō)是簡(jiǎn)單易懂的。其他的XML解析函數(shù)被設(shè)計(jì)成語(yǔ)言通用的(支持相同的api函數(shù)在java,c++,甚至是javascript中)。Jdom利用了java的優(yōu)秀的特征,如:方法重載、回收機(jī)制,和后臺(tái)處理等。
為了能夠簡(jiǎn)單易用,這些函數(shù)不得不以程序員喜歡的形式來(lái)描繪XML文檔。例如:程序員想的到的一個(gè)元素的文本內(nèi)容是什么樣子的呢?
<element>This is my text content</element>
在一些api中,元素的文本內(nèi)容僅被當(dāng)作是一個(gè)元素的孩子節(jié)點(diǎn)。從技術(shù)角度來(lái)說(shuō),這個(gè)設(shè)計(jì)需要下面的代碼才能訪(fǎng)問(wèn)到元素的內(nèi)容:
String content = element.getFirstChild().getValue();
Jdom用一種更簡(jiǎn)單易用的方法來(lái)取得元素的內(nèi)容:
String text = element.getText();
Jdom盡可能的減少程序員的工作量。依據(jù)拇指規(guī)則,Jdom應(yīng)該用20%或是更少的努力來(lái)完成80%或是更多的java/xml方面的問(wèn)題。這并不是說(shuō)Jdom只是支持80%的XML規(guī)范(實(shí)際上我們希望Jdom100%的支持XML規(guī)范)。這個(gè)拇指規(guī)則是說(shuō)有些東西可以加進(jìn)去,但是沒(méi)有必要。這些api函數(shù)應(yīng)該保持簡(jiǎn)潔。
Jdom的第二條原則是說(shuō)Jdom應(yīng)該是快速的和輕量級(jí)的。調(diào)入和執(zhí)行文檔應(yīng)該快速,內(nèi)存的消耗應(yīng)該盡量小。Jdom的設(shè)計(jì)明顯是遵循這個(gè)原則。例如,就算在開(kāi)始的時(shí)候,不太協(xié)調(diào)的操作已經(jīng)比DOM快,但是比SAX顯的粗糙。盡管這樣,Jdom還是有許多SAX沒(méi)有的優(yōu)點(diǎn)。
你需要Jdom嗎?
那么,你需要Jdom嗎?這真是一個(gè)很好的問(wèn)題。已經(jīng)有了存在的標(biāo)準(zhǔn),為什么還要去發(fā)明一個(gè)新的呢?答案是Jdom解決了現(xiàn)有的標(biāo)準(zhǔn)解決不了的問(wèn)題。
DOM完全在內(nèi)存中描述一個(gè)元素樹(shù)。它是一個(gè)大的api,被設(shè)計(jì)操作幾乎所有可能的XML任務(wù)。它也必須有相同的api去支持不同的語(yǔ)言。因?yàn)檫@些限制,對(duì)那些習(xí)慣使用java的特征,如方法重載、簡(jiǎn)單的set,get方法的java程序員來(lái)說(shuō),就很不習(xí)慣。DOM還需要大量的內(nèi)存和較高的主頻,這使它很難和許多輕量級(jí)的web應(yīng)用一起工作。
SAX沒(méi)有在內(nèi)存中建立一個(gè)元素樹(shù),它用事情發(fā)展的方式來(lái)描述。例如:它報(bào)告每個(gè)讀到的開(kāi)始標(biāo)記和結(jié)束標(biāo)記。這種處理方式使它成為一個(gè)輕量級(jí)的快速讀取的api。然而,這種事件處理方式對(duì)服務(wù)器端的java程序員來(lái)說(shuō)不夠直觀。SAX也不支持修改XML文檔和隨機(jī)讀取。
Jdom試圖組合DOM和SAX的優(yōu)點(diǎn)。它被設(shè)計(jì)成一個(gè)可以在小內(nèi)存上快速執(zhí)行輕量級(jí)api 。Jdom也支持隨機(jī)讀取整個(gè)文檔,但是令人驚異的是它并不需要把整個(gè)文檔讀到內(nèi)存中。這個(gè)api支持未來(lái)的當(dāng)需要時(shí)才讀入信息的次輕量級(jí)操作。還有,Jdom通過(guò)標(biāo)準(zhǔn)的構(gòu)造器和set方法支持XML文檔的修改。
三、獲取XML文檔
SAXBuilder builder = new SAXBuilder();Document doc = builder.build(url);
你可以用org.Jdom.input包中提供的構(gòu)造類(lèi)從任何數(shù)據(jù)源中構(gòu)造文檔。最近,有兩種構(gòu)造方式:SAXBuilder 和 DOMBuilder。SAXBuilder用sax解析器從文件中構(gòu)造文檔。SAXBuilder偵聽(tīng)sax事件并從內(nèi)存中建立一個(gè)相應(yīng)的文檔。這種方式非常快(基本上和sax一樣快),這也是我們推薦的方式。DOMBuilder是另一種可選的方式,它從一個(gè)存在的org.w3c.dom.Document對(duì)象中建立Jdom文檔。它答應(yīng)Jdom輕松的和構(gòu)建DOM樹(shù)的工具實(shí)現(xiàn)接口。
Jdom的速度有值得期待的提高的潛力通過(guò)一個(gè)延期的構(gòu)造器的完成。這個(gè)構(gòu)造器檢查XML數(shù)據(jù)源,但當(dāng)請(qǐng)求的時(shí)候才對(duì)它解析。例如:文檔的屬性當(dāng)不訪(fǎng)問(wèn)時(shí)是不需要解析的。
構(gòu)造器仍在發(fā)展,可以通sql查詢(xún)、ldap查詢(xún)和其他的數(shù)據(jù)格式來(lái)夠造Jdom文檔。所以,一旦進(jìn)到內(nèi)存中,文檔就和建造它的工具沒(méi)有關(guān)系了。
SAXBuilder 和 DOMBuilder構(gòu)造器答應(yīng)用戶(hù)指明他們是否應(yīng)該輪換,以便確定哪個(gè)解析器時(shí)間執(zhí)行解析的任務(wù)。
public SAXBuilder(String parserClass, boolean validation);public DOMBuilder(String adapterClass, boolean validation);
默認(rèn)的是用apache的開(kāi)源 Xerces解析器并且是關(guān)閉輪換的。你應(yīng)該注到DOMBuilder不象一個(gè)解析類(lèi),倒更象一個(gè)適配類(lèi)。這是因?yàn)椴皇撬械腄OM解析器都是相同的api。為了仍讓用戶(hù)選擇喜歡的解析器,Jdom使用一個(gè)對(duì)所有的dom解析器適用的公共的api的適配類(lèi)。這個(gè)適配類(lèi)支持所有流行的dom解析器,包括Apache 的 Xerces, Crimson,IBM 的 XML4J, Sun 的 PRoject X, 和Oracle 的 parsers V1 and V2.每一個(gè)解析器通過(guò)正確的調(diào)用別的解析器的方法執(zhí)行標(biāo)準(zhǔn)的接口。這有點(diǎn)象jaXP,除了它支持jaxp所不支持的新的解析器。
四、輸出XML文檔
你可以用幾種不同的標(biāo)準(zhǔn)輸出工具輸出一個(gè)XML文檔。org.Jdom.output.XMLOutputter也許是最常用方法。它將xml文檔寫(xiě)入一個(gè)特定的OutputStream.
SAXOutputter工具是另一個(gè)選擇。它產(chǎn)生基于Jdom xml文檔的sax事件,你可以把這些送到等待這些sax事件的應(yīng)用程序那里。相同的方式,DOMOutputter產(chǎn)生一個(gè)dom文檔,這樣你就可以把它送給可以接收dom文檔的應(yīng)用程序。輸出xml文檔的代碼看起來(lái)象下邊的樣子:
XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, System.out);
XMLOutputter用參數(shù)定制輸出的格式。第一個(gè)參數(shù)是行縮進(jìn)的格式;第二個(gè)參數(shù)是你是否想另起一行。因?yàn)闄C(jī)器到機(jī)器的原因,為了速度考慮你可以放棄行縮進(jìn)和另起新行。
XMLOutputter outputter = new XMLOutputter("", false);
outputter.output(doc, System.out);
(譯注:這樣的話(huà)自己看起來(lái)會(huì)很不好看,而且每一次重新寫(xiě)入的時(shí)候都會(huì)使這個(gè)xml文件變大,所以我建議還是要縮進(jìn)和另起一行,支持中文的帶換行和縮進(jìn)的格式如下:
XMLOutputter outp = new XMLOutputter(“”,true,"GB2312");
outp.setTextTrim(true);
outp.output(doc, System.out);
下面是讀入一個(gè)xml文檔,并把它又輸出的例子:
import java.io.*;
import org.Jdom.*;
import org.Jdom.input.*;
import org.Jdom.output.*;
public class PrettyPrinter {
public static void main(String[] args) {
// Assume filename argument
String filename = args[0];
try {
// Build the document with SAX and Xerces, no validation
SAXBuilder builder = new SAXBuilder();
// Create the document
Document doc = builder.build(new File(filename));
// Output the document, use standard formatter
XMLOutputter fmt = new XMLOutputter();
fmt.output(doc, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注