dom是解析xml的底層接口之一(另外一種是sax)
而jdom和dom4j則是基於底層api的更高級封裝
dom是通用的,而jdom和dom4j則是面向java語言的
DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片段的集合。這個層次結構容許開發人員在樹中尋找特定信息。分析該結構一般須要加載整個文檔和構造層次結構,而後才能作任何工做。因爲它是基於信息層次的,於是 DOM 被認爲是基於樹或基於對象的。DOM 以及廣義的基於樹的處理具備幾個優勢。首先,因爲樹在內存中是持久的,所以能夠修改它以便應用程序能對數據和結構做出更改。它還能夠在任什麼時候候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
XML的四種解析器(dom,sax,jdom,dom4j)原理及性能比較
(轉自zsq)
一、DOM
DOM 是用與平臺和語言無關的方式表示 XML 文檔的官方 W3C 標準。DOM 是以層次結構組織的節點或信息片段的集合。這個層次結構容許開發人員在樹中尋找特定信息。分析該結構一般須要加載整個文檔和構造層次結構,而後才能作任何工做。因爲它是基於信息層次的,於是 DOM 被認爲是基於樹或基於對象的。DOM 以及廣義的基於樹的處理具備幾個優勢。
首先,因爲樹在內存中是持久的,所以能夠修改它以便應用程序能對數據和結構做出更改。它還能夠在任什麼時候候在樹中上下導航,而不是像 SAX 那樣是一次性的處理。DOM 使用起來也要簡單得多。
另外一方面,對於特別大的文檔,解析和加載整個文檔可能很慢且很耗資源,所以使用其餘手段來處理這樣的數據會更好。這些基於事件的模型,好比 SAX。
二、SAX
這種處理的優勢很是相似於流媒體的優勢。分析可以當即開始,而不是等待全部的數據被處理。並且,因爲應用程序只是在讀取數據時檢查數據,所以不須要將數據存儲在內存中。這對於大型文檔來講是個巨大的優勢。事實上,應用程序甚至沒必要解析整個文檔;它能夠在某個條件獲得知足時中止解析。通常來講,SAX 還比它的替代者 DOM 快許多。
三、選擇 DOM 仍是選擇 SAX ?
對於須要本身編寫代碼來處理 XML 文檔的開發人員來講,選擇 DOM 仍是 SAX 解析模型是一個很是重要的設計決策。
DOM 採用創建樹形結構的方式訪問 XML 文檔,而 SAX 採用的事件模型。
DOM 解析器把 XML 文檔轉化爲一個包含其內容的樹,並能夠對樹進行遍歷。用 DOM 解析模型的優勢是編程容易,開發人員只須要調用建樹的指令,而後利用navigation APIs訪問所需的樹節點來完成任務。能夠很容易的添加和修改樹中的元素。然而因爲使用 DOM 解析器的時候須要處理整個 XML 文檔,因此對性能和內存的要求比較高,尤爲是遇到很大的 XML 文件的時候。因爲它的遍歷能力,DOM 解析器經常使用於 XML 文檔須要頻繁的改變的服務中。
SAX 解析器採用了基於事件的模型,它在解析 XML 文檔的時候能夠觸發一系列的事件,當發現給定的tag的時候,它能夠激活一個回調方法,告訴該方法制定的標籤已經找到。SAX 對內存的要求一般會比較低,由於它讓開發人員本身來決定所要處理的tag。特別是當開發人員只須要處理文檔中所包含的部分數據時,SAX 這種擴展能力獲得了更好的體現。但用 SAX 解析器的時候編碼工做會比較困難,並且很難同時訪問同一個文檔中的多處不一樣數據。
四、JDOM
JDOM的目的是成爲 Java 特定文檔模型,它簡化與 XML 的交互而且比使用 DOM 實現更快。因爲是第一個 Java 特定模型,JDOM 一直獲得大力推廣和促進。正在考慮經過「Java 規範請求 JSR-102」將它最終用做「Java 標準擴展」。從 2000 年初就已經開始了 JDOM 開發。
JDOM 與 DOM 主要有兩方面不一樣。首先,JDOM 僅使用具體類而不使用接口。這在某些方面簡化了 API,可是也限制了靈活性。第二,API 大量使用了 Collections 類,簡化了那些已經熟悉這些類的 Java 開發者的使用。
JDOM 文檔聲明其目的是「使用 20%(或更少)的精力解決 80%(或更多)Java/XML 問題」(根據學習曲線假定爲 20%)。JDOM 對於大多數 Java/XML 應用程序來講固然是有用的,而且大多數開發者發現 API 比 DOM 容易理解得多。JDOM 還包括對程序行爲的至關普遍檢查以防止用戶作任何在 XML 中無心義的事。然而,它仍須要您充分理解 XML 以便作一些超出基本的工做(或者甚至理解某些狀況下的錯誤)。這也許是比學習 DOM 或 JDOM 接口都更有意義的工做。
JDOM 自身不包含解析器。它一般使用 SAX2 解析器來解析和驗證輸入 XML 文檔(儘管它還能夠將之前構造的 DOM 表示做爲輸入)。它包含一些轉換器以將 JDOM 表示輸出成 SAX2 事件流、DOM 模型或 XML 文本文檔。JDOM 是在 Apache 許可證變體下發布的開放源碼。
五、DOM4J
雖然 DOM4J 表明了徹底獨立的開發結果,但最初,它是 JDOM 的一種智能分支。它合併了許多超出基本 XML 文檔表示的功能,包括集成的 XPath 支持、XML Schema 支持以及用於大文檔或流化文檔的基於事件的處理。它還提供了構建文檔表示的選項,它經過 DOM4J API 和標準 DOM 接口具備並行訪問功能。從 2000 下半年開始,它就一直處於開發之中。
爲支持全部這些功能,DOM4J 使用接口和抽象基本類方法。DOM4J 大量使用了 API 中的 Collections 類,可是在許多狀況下,它還提供一些替代方法以容許更好的性能或更直接的編碼方法。直接好處是,雖然 DOM4J 付出了更復雜的 API 的代價,可是它提供了比 JDOM 大得多的靈活性。
在添加靈活性、XPath 集成和對大文檔處理的目標時,DOM4J 的目標與 JDOM 是同樣的:針對 Java 開發者的易用性和直觀操做。它還致力於成爲比 JDOM 更完整的解決方案,實如今本質上處理全部 Java/XML 問題的目標。在完成該目標時,它比 JDOM 更少強調防止不正確的應用程序行爲。
DOM4J 是一個很是很是優秀的Java XML API,具備性能優異、功能強大和極端易用使用的特色,同時它也是一個開放源代碼的軟件。現在你能夠看到愈來愈多的 Java 軟件都在使用 DOM4J 來讀寫 XML,特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J。
六、總述
JDOM 和 DOM 在性能測試時表現不佳,在測試 10M 文檔時內存溢出。在小文檔狀況下還值得考慮使用 DOM 和 JDOM。雖然 JDOM 的開發者已經說明他們指望在正式發行版前專一性能問題,可是從性能觀點來看,它確實沒有值得推薦之處。另外,DOM 還是一個很是好的選擇。DOM 實現普遍應用於多種編程語言。它仍是許多其它與 XML 相關的標準的基礎,由於它正式得到 W3C 推薦(與基於非標準的 Java 模型相對),因此在某些類型的項目中可能也須要它(如在 javascript 中使用 DOM)。
SAX表現較好,這要依賴於它特定的解析方式。一個 SAX 檢測即將到來的XML流,但並無載入到內存(固然當XML流被讀入時,會有部分文檔暫時隱藏在內存中)。
無疑,DOM4J是最好的,目前許多開源項目中大量採用 DOM4J,例如大名鼎鼎的 Hibernate 也用 DOM4J 來讀取 XML 配置文件。若是不考慮可移植性,那就採用DOM4J吧!