天天看點

簡說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的實作。