stax(simple stream api for xml)作為jsr已經出現幾年時間了,可能不如sax,dom(及其他基于其上的工具包比如jdom,jaxp,etc)為眾人所知。可能也是因為最近xfire的火熱 導致它的知名度有所提升吧。(題 外話,好象有不少知識點一直都是默默無聞的,只有隨著某項技術的流行才突然變的為人所知道了,比如ThreadLocal本來我們一直沒有接觸,很多人可能一直都不知道它的存在,但隨著它在spring ,hibernate這些流行的技術里的靈巧的應用,一下子就被很多人談及及應用了。可見我們的水平還是屬于跟在老外屁股后面跑的水平)。
通過和dom,sax這兩種大家熟知的xml解析方式的比較,可以容易的看出它的特點。
dom通過把整個tree 文檔讀入內存進行操作,可以隨意對文檔進行操作,非常靈活。但缺點是對內存的資源耗費比較大。
sax不同于dom把整個文檔讀入內存的方式,它是直接對 xml文件進行操作。速度快,基本上不占用什么內存資源。缺點看看它的名字就知道了(simple api for xml),基于event的方式(這點和stax類似),但是是通過callback的方式把對xml的遍歷權交給sax parser了。這樣導致我們不能靈活控制對xml文件的訪問。
stax通過stream的方式來解決sax,dom各自的缺點,同時具有他們大部分的優點(我想底層實現是不是通過直接操作文件流的方式,還沒有看它的實現的src,不敢亂說)。stax主要有兩中粒度不同的操作方式 ,一種基于event, 另一種更底層的實現基于cursor。初一看實現方式有點象sax,因為都是基于event的。但是sax把訪問控制權交給parser(通過callback))了,我們很難控制iterat過程。stax允許我們自己控制iterat.
所以stax的優點如下:基于stream的方式,不象dom耗費內存資源。又可以自己控制對xml的iterat,不象sax把控制權交給parser).還有一個優點就是可以在iterat的過程中隨時cancel。雖然sax 也可以通過 throw saxexception的方式中斷iterat過程,但畢竟不是一中優美的解決方案。當然stax的還提供了以stream的方式進行write xml的操作。
?具體的stax應用可以看ibm的系列教程文章,比較老了了點。http://www-128.ibm.com/developerworks/xml/library/x-tipstx/
具體實現,除了bea的一個ri實現外,不知道還有其他的實現沒有(stax jsr好象最早由bea提出來)?
個人感覺stax的應用還是有些麻煩,期待(或則是不是已經有了?)能有更高層次的封裝(類似于jdom,jaxp實現之類的)。