簡說XML的解析方式(DOM,SAX,StAX)

一般來說,解析XML文件存在着兩種方式,一種是event-based API,比如說象SAX,XNI. 第二種是tree-based API,比如說DOM,JDOM,DOM4j等等. 一般來說,讀取配置文件時,我們一般比較喜歡應用tree-based API這種方式,就是把xml文件讀入,變成DOM形式的一棵樹,然後進行查找,獲取自己說想要的東西. 但是,這種方式有個缺點,那就是如果你這個XML文件很大的話,你需要佔用很大的內存.
所以對於很大的一個xml文件,又不需要進行隨機查找的時候,比較適合採用event-based API,那就是說他解析xml文件,如果是START_ELEMENT,那麼他就調用startElement()的回調方法..他遍歷過了就過了,不能再回去. 
在event-based API中又存在兩種方式: 一個是PUSH的方式,就比如說是SAX. 另外一種是PULL的方式,比如StAX. 
怎麼來理解PUSH和PULL的區別呢. 先假設有這麼三個角色: application, xmlFile, xmlParser. 那麼,如果我們採用PUSH的方式,步驟爲:
 1. 創建一個xmlParser.
 2. 把我們的application處理xml的註冊到xmlParser.
 3. xmlParser遍歷xmlFile,然後來調用application.
這裏面,用的是Observer的模式,就是接收到event的時候,去調用event的callback函數, 這裏面有個很不好的地方就是,你application反而是被Parser控制了.
於是,就出現了PULL方式的解析.
 1. 創建一個xmlParser
 2. xmlParser打開一個xmlFile
 3. application調用這個xmlParser, 來獲取xmlParser打開xmlFile所得到的一系列event.
這裏,用到了Iterator的模式. 最主要的一點是: 這個時候application控制了xmlParser.
StAX有兩種API,一種是cursor-based,一種是iterator-based. 這兩種詳細的比較參考:
http://java.sun.com/webservices/docs/1.6/tutorial/doc/SJSXP3.html#wp102139

這裏,SAX和StAX的另外一點區別是: SAX只能讀xml文件. StAX不但能讀xml文件,而且還能寫xml文件.

      傳統的處理XML的API有DOM和SAX兩種,DOM速度慢,佔用內存極大。SAX雖然比DOM快,但速度任不理想。現在,一種新的基於流的Stream API for XML(簡稱 StAX)極大地提高了XML的處理速度,並且已經稱爲JSR 173標準(http://www.jcp.org/en/jsr/detail?id=173)。目前,StAX最好的開源實現是Woodstox(http://woodstox.codehaus.org/),它完整地支持StAX API。Resin3.1也內置了StAX的實現,但是並沒有支持所以的StAX API。XFire在ClassPath上如果找到了StAX API的定義,就會試圖定位一個StAX的實現。

參考資料:
An Introduction to StAX
Having Good SAX with Java

發佈了51 篇原創文章 · 獲贊 6 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章