XML使用SAX解析與PULL解析的區別

XML使用SAX解析與PULL解析的區別

在最近的應用中,經常會用到對XML的解析,但是一直有一個疑問就是SAX解析與PULL解析的區別到底是什麼。搜索了相關的問題,整理如下,以便大家查詢。

我們知道,SAX解析是事件驅動的,它不會將整個文檔讀入內存再解析,而是在讀取文檔的過程中就解析它,所以,文檔讀入的過程也就是SAX解析的過程。雖然,SAX方式解析XML不會將整個文檔放入內存,但它還是會遍歷完畢文檔中所有的節點。那麼,當我們在解析XML文件時,如果只需要文檔前邊或是中間一小部分數據,使用SAX解析就浪費了處理器資源,這時我們使用PULL解析就非常合適了。

SAX是一種基於“推”的解析方式,這種解析方法速度快、佔用內存少,但是它需要應用程序自己處理解析器的狀態,實現起來會比較麻煩,而且它只支持對XML文件的讀取,不支持寫入。“推”到底是怎麼回事呢?SAX解析器的工作方式是自動將事件推入註冊的事件處理器進行處理,因此我們不能控制事件的處理主動結束。

PULL則是一種基於“拉”的解析方式,即應用程序根據自己的需要控制解析器的讀取。這種方式繼承了SAX解析速度快、佔用內存少等優點,同時它也保持了接口簡單、編程容易等特點。“拉”又是怎麼回事呢?PULL解析器的工作方式爲允許應用程序代碼主動從解析器中獲取事件,正因爲是主動獲取事件,因此可以在滿足了需要的條件後不再獲取事件,結束解析。

使用SAX解析,在解析器解析過程中通過回調把TAB/VALUE值等傳給我們,我們可以直接拿到這些值進行比較、處理。而PULL的原理是它只告訴我們一個TAG開始或者結束了,至於TAG/VALUE的值是什麼需要我們自己去向解析器問,所以叫做PULL(拉),而SAX看起來是PUSH(推)給我們的。

其實再從我們之前的例子中也可以看出SAX與PULL之間的區別,PULL是使用一個循環結構,循環體中我們可以隨時跳出(break),而SAX不是,SAX是隻要開始解析了,就必須解析完成。所以PULL的使用比SAX會更加靈活,在Android的開發中,更推薦使用PULL解析XML。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章