java解析xml文檔的幾種方式,概論

底層解析方式

1. DOM解析(Document Object Model)

  • w3c官方的標準,允許獲取和操作文檔的任意部分。
  • 缺點
    • 通常需要加載整個xml文檔來構造層次結構,消耗資源較大。
  • 優點
    • 允許應用程序對數據和結構做出更改
    • 訪問是雙向的,可以在任何時候在樹中上下導航,獲取和操作任意部分的數據

2. SAX解析(Simple API for XML)

  • 通過流模式中的推模型分析方式讀取,通過事件驅動,每發現一個節點就會引發一個事件,通過回調方法完成解析工作,解析XML文檔的邏輯需要應用程序完成。推模式的,所有的操作在解析器自動控制下進行,所有事件都會處理,不管需不需要解析整個文檔,解析器都會自動啓動解析任務,然後按順序向下解析,直到解析完成才終止
  • 缺點
    • 需要應用程序自己負責標籤的處理邏輯,使用麻煩
    • 單項導航,很難同時訪問同一文檔中的不同部分數據,不支持XPath
  • 優點
    • 不需要加載全部文檔,即可立即分析
    • 只在讀取數據時檢查數據,不需要保存在內存
    • 效率和性能較高,能解析大於系統內存的文檔

包裝底層的解析方式

JDOM解析(Java-based Document Object Model)

  • JDOM文檔聲明其目的是“使用20%(或更少)的精力解決80%(或更多)Java/XML問題”,極大減少了代碼量。而JDOM和DOM4J則是基於底層API的更高級封裝。DOM是通用的,而JDOM和DOM4J則是面向java語言的。JDOM是處理XML的純JavaAPI,使用具體類而不是接口。JDOM是基於樹的處理XML的JavaAPI,把樹加載到內存中,同時又有SAX的Java規則。JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口。這在某些方面簡化了API,但是也限制了靈活性。第二,API大量使用了Java集合類,便於Java開發者使用。JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗證輸入XML文檔(儘管它還可以將以前構造的DOM表示作爲輸入)。它包含一些轉換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文本文檔。
  • 缺點
    • 沒有較好的靈活性
    • 性能較差
    • 不能處理大於內存的文檔
  • 優點
    • 使用具體的類,而不是接口,簡化了DOM的API
    • 大量使用了Java集合類,方便Java開發人員

DOM4J(Document Object Model for Java)

  • 簡單易用採用Java集合框架,並完全支持DOM,SAX和JAXP,開放源代碼。你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J。目前許多開源項目中大量採用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來讀取XML配置文件
  • 缺點
    • 大量使用的API接口,API較爲複雜
  • 優點
    • 大量使用了Java集合類,方便Java開發人員,同時提供一些高性能的替代方法
    • 支持XPath
    • 有很高的性能

StAX | PULL (Streaming API for XML)

pull 是StAX的一個實現

  • 通過流模式中的拉模型分析方式,提供基於指針和迭代器兩種支持的方式,StAX 是拉模式的,可以由用戶根據需要控制需要處理事件類型及何時終止解析任務,用戶調用一次next(),解析器就進行一次向下解析,完全在用戶的控制下進行解析操作,在需要的解析工作已經完成時,可以隨時終止解析。
  • 缺點
    • 單向導航,不支持XPath,很難訪問同一文檔中的不同部分
  • 優點
    • 接口簡單,使用方便
    • 可以在某個條件得到滿足時停止分析,不必解析整個文檔
    • 採用流模型分析方式,有較好的性能

比較不同解析方式的性能於差異

創建三個不同大小的XML文檔

  • smallusers.xml(100KB)
  • middleusers.xml(1MB)
  • bigusers.xml(10MB)
    分別用以上五種解析方式對這三個XML進行解析,然後打印出所有的用戶信息,並分別計算它們所用的時間

單位:s(秒)

100KB 1MB 10MB
DOM 0.146s 0.469s
SAX 0.110s 0.328s
JDOM 0.172s 0.756s
DOM4J 0.161s 0.422s
StAX Stream 0.093s 0.334s
StAX Event 0.131s 0.359s
  • 由上面的測試結果可以看出,性能表現最好的是SAX,其次是StAX Stream和StAX Event,DOM和DOM4J也有着不錯的表現。性能最差的是JDOM。
  • 所以,如果你的應用程序對性能的要求很高,SAX當然是首選。如果你需要訪問和控制任意數據的功能,DOM是個很好的選擇,而對Java開發人員來講,DOM4J是更好的選擇。
  • 如果只需要做XML文檔解析的話,綜合性能、易用性、面向對象特徵等各方面來衡量,StAX Event無疑是最好的選擇。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章