概述:
Jdom是用Java語言讀、寫、操作XML的新API函數。Jason Hunter 和 Brett McLaughlin公開發布了它的測試版本。在直覺、簡單和高效的前提下,這些API函數被最大限度的最佳化。在接下來的篇幅裡,Hunter 和 McLaughlin介紹怎麼用Jdom去讀寫一個已經存在的XML文檔。
Jdom是一個開源的api,它以直接易懂的方式向java程式員描述XML文檔和文檔的內容。就象名字揭示的那樣,Jdom是為java最佳化的。為使用XML文檔提供一個低消耗的方法。Jdom的使用者可以不必掌握太多的XML的知識就可以完成想要的操作。
Jdom可以和已有的XML技術如Simple API for XML (SAX)和 Document Object Model (DOM)相互協作.然而,它並不是簡單的從這些api中提取出一些。Jdom從這些已存在的技術中吸收了好的方面,自己建立了一套新的類和介面,用一個Jdom使用者的話來說就是:“這些介面是我從一開始閱讀org.w3c.dom就期待的”;Jdom可以讀入SAX或是DOM的內容,也可以輸出SAX或DOM可以接收的格式。這個能力可以使Jdom很好的和已有的用SAX或DOM建立的系統之間整合。
Jdom的原則
第一條並且是最重要的一條就是Jdom的api函數被設計成對java程式員來說是簡單易懂的。其他的XML解析函數被設計成語言通用的(支援相同的api函數在java,c++,甚至是javascript中)。Jdom利用了java的優秀的特徵,如:方法重載、回收機制,和幕後處理等。
為了能夠簡單易用,這些函數不得不以程式員喜歡的形式來描繪XML文檔。例如:程式員想的到的一個元素的常值內容是什麼樣子的呢?
| <element>This is my text content</element> |
在一些api中,元素的常值內容僅被當作是一個元素的孩子節點。從技術角度來說,這個設計需要下面的代碼才能訪問到元素的內容:
| String content = element.getFirstChild().getValue(); |
Jdom用一種更簡單易用的方法來取得元素的內容:
| String text = element.getText(); |
Jdom儘可能的減少程式員的工作量。依據拇指規則,Jdom應該用20%或是更少的努力來完成80%或是更多的java/xml方面的問題。這並不是說Jdom只是支援80%的XML規範(實際上我們希望Jdom100%的支援XML規範)。這個拇指規則是說有些東西可以加進去,但是沒有必要。這些api函數應該保持簡潔。
Jdom的第二條原則是說Jdom應該是快速的和輕量級的。調入和執行文檔應該快速,記憶體的消耗應該盡量小。Jdom的設計明顯是遵循這個原則。例如,就算在開始的時候,不太協調的操作已經比DOM快,但是比SAX顯的粗糙。儘管這樣,Jdom還是有許多SAX沒有的優點。
你需要Jdom嗎?
那麼,你需要Jdom嗎?這真是一個很好的問題。已經有了存在的標準,為什麼還要去發明一個新的呢?答案是Jdom解決了現有的標準解決不了的問題。
DOM完全在記憶體中描述一個元素樹。它是一個大的api,被設計操作幾乎所有可能的XML任務。它也必須有相同的api去支援不同的語言。因為這些限制,對那些習慣使用java的特徵,如方法重載、簡單的set,get方法的java程式員來說,就很不習慣。DOM還需要大量的記憶體和較高的主頻,這使它很難和許多輕量級的web應用一起工作。
SAX沒有在記憶體中建立一個元素樹,它用事情發展的方式來描述。例如:它報告每個讀到的開始標記和結束標記。這種處理方式使它成為一個輕量級的快速讀取的api。然而,這種事件處理方式對伺服器端的java程式員來說不夠直觀。SAX也不支援修改XML文檔和隨機讀取。
Jdom試圖組合DOM和SAX的優點。它被設計成一個可以在小記憶體上快速執行輕量級api 。Jdom也支援隨機讀取整個文檔,但是令人驚奇的是它並不需要把整個文檔讀到記憶體中。這個api支援未來的當需要時才讀入資訊的次輕量級操作。還有,Jdom通過標準的構造器和set方法支援XML文檔的修改。
擷取XML文檔
Jdom用org.Jdom.Document類的一個執行個體來描述一個XML文檔。這個文檔類是一個輕重量級的,它可以包括文件類型、多處理指示的對象、一個根項目和注釋對象。你可以不需要構造器而從草稿構造一個文檔。
| Document doc = new Document(new Element("rootElement")); |
本文後面我們會討論從草稿構造一個XML文檔是多麼的容易。但是現在,我們從一個已存在的檔案、一個流、或是一個URL路徑中構造我們的文檔。
SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(url); |
你可以用org.Jdom.input包中提供的構造類從任何資料來源中構造文檔。最近,有兩種構造方式:SAXBuilder 和 DOMBuilder。SAXBuilder用sax解析器從檔案中構造文檔。SAXBuilder偵聽sax事件並從記憶體中建立一個相應的文檔。這種方式非常快(基本上和sax一樣快),這也是我們推薦的方式。DOMBuilder是另一種可選的方式,它從一個存在的org.w3c.dom.Document對象中建立Jdom文檔。它允許Jdom輕鬆的和構建DOM樹的工具實現介面。
Jdom的速度有值得期待的提高的潛力通過一個延期的構造器的完成。這個構造器檢查XML資料來源,但當請求的時候才對它解析。例如:文檔的屬性當不訪問時是不需要解析的。
構造器仍在發展,可以通sql查詢、ldap查詢和其他的資料格式來夠造Jdom文檔。所以,一旦進到記憶體中,文檔就和建造它的工具沒有關係了。
SAXBuilder 和 DOMBuilder構造器允許使用者指明他們是否應該輪換,以便確定哪個解析器時間執行解析的任務。
public SAXBuilder(String parserClass, boolean validation); public DOMBuilder(String adapterClass, boolean validation); |
預設的是用apache的開源 Xerces解析器並且是關閉輪換的。你應該注到DOMBuilder不象一個解析類,倒更象一個適配類。這是因為不是所有的DOM解析器都是相同的api。為了仍讓使用者選擇喜歡的解析器,Jdom使用一個對所有的dom解析器適用的公用的api的適配類。這個適配類支援所有流行的dom解析器,包括Apache 的 Xerces, Crimson,IBM 的 XML4J, Sun 的 Project X, 和Oracle 的 parsers V1 and V2.每一個解析器通過正確的調用別的解析器的方法執行標準的介面。這有點象jaxp,除了它支援jaxp所不支援的新的解析器。