- DOM
DOM是基于樹(shù)形結(jié)構(gòu)的的節(jié)點(diǎn)或信息片段的集合,允許開(kāi)發(fā)人員使用DOM API遍歷XML樹(shù)、檢索所需數(shù)據(jù)。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造樹(shù)形結(jié)構(gòu),然后才可以檢索和更新節(jié)點(diǎn)信息。
Android完全支持DOM 解析。利用DOM中的對(duì)象,可以對(duì)XML文檔進(jìn)行讀取、搜索、修改、添加和刪除等操作。
DOM的工作原理:使用DOM對(duì)XML文件進(jìn)行操作時(shí),首先要解析文件,將文件分為獨(dú)立的元素、屬性和注釋等,然后以節(jié)點(diǎn)樹(shù)的形式在內(nèi)存中對(duì)XML文件進(jìn)行表示,就可以通過(guò)節(jié)點(diǎn)樹(shù)訪問(wèn)文檔的內(nèi)容,并根據(jù)需要修改文檔。
由于DOM在內(nèi)存中以樹(shù)形結(jié)構(gòu)存放,因此檢索和更新效率會(huì)更高。但是對(duì)于特別大的文檔,解析和加載整個(gè)文檔將會(huì)很耗資源。 當(dāng)然,如果XML文件的內(nèi)容比較小,采用DOM是可行的。

- SAX
SAX(Simple API for XML)解析器是一種基于事件的解析器,事件驅(qū)動(dòng)的流式解析方式是,從文件的開(kāi)始順序解析到文檔的結(jié)束,不可暫停或倒退。它的核心是事件處理模式,
主要是圍繞著事件源以及事件處理器來(lái)工作的。當(dāng)事件源產(chǎn)生事件后,調(diào)用事件處理器相應(yīng)的處理方法,一個(gè)事件就可以得到處理。在事件源調(diào)用事件處理器中特定方法的時(shí)候,還要傳遞給事件處理器相應(yīng)事件的狀態(tài)信息,這樣事件處理器才能夠根據(jù)提供的事件信息來(lái)決定自己的行為。
SAX的工作原理:SAX的工作原理簡(jiǎn)單地說(shuō)就是對(duì)文檔進(jìn)行順序掃描,當(dāng)掃描到文檔(document)開(kāi)始與結(jié)束、元素(element)開(kāi)始與結(jié)束等地方時(shí)通知事件處理函數(shù),由事件處理函數(shù)做相應(yīng)動(dòng)作,然后繼續(xù)同樣的掃描,直至文檔結(jié)束。
SAX解析器的優(yōu)點(diǎn)是解析速度快,占用內(nèi)存少。非常適合在Android移動(dòng)設(shè)備中使用。

- PULL
Android并未提供對(duì)Java StAX API的支持。但是,Android附帶了一個(gè)pull解析器,其工作方式類似于StAX。它允許用戶的應(yīng)用程序代碼從解析器中獲取事件,這與SAX解析器自動(dòng)將事件推入處理程序相反。
PULL解析器的運(yùn)行方式和SAX類似,都是基于事件的模式。不同的是,在PULL解析過(guò)程中返回的是數(shù)字,且我們需要自己獲取產(chǎn)生的事件然后做相應(yīng)的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法,執(zhí)行我們的代碼。
PULL 的工作原理:XML pull提供了開(kāi)始元素和結(jié)束元素。當(dāng)某個(gè)元素開(kāi)始時(shí),我們可以調(diào)用parser.nextText從XML文檔中提取所有字符數(shù)據(jù)。當(dāng)解釋到一個(gè)文檔結(jié)束時(shí),自動(dòng)生成EndDocument事件。
PULL解析器小巧輕便,解析速度快,簡(jiǎn)單易用,非常適合在Android移動(dòng)設(shè)備中使用,Android系統(tǒng)內(nèi)部在解析各種XML時(shí)也是用PULL解析器,Android官方推薦開(kāi)發(fā)者們使用Pull解析技術(shù)。Pull解析技術(shù)是第三方開(kāi)發(fā)的開(kāi)源技術(shù),它同樣可以應(yīng)用于JavaSE開(kāi)發(fā)。

**幾種解析技術(shù)的比較與總結(jié): **
對(duì)于Android的移動(dòng)設(shè)備而言,因?yàn)樵O(shè)備的資源比較寶貴,內(nèi)存是有限的,所以我們需要選擇適合的技術(shù)來(lái)解析XML,這樣有利于提高訪問(wèn)的速度。
1.DOM在處理XML文件時(shí),將XML文件解析成樹(shù)狀結(jié)構(gòu)并放入內(nèi)存中進(jìn)行處理。當(dāng)XML文件較小時(shí),我們可以選DOM,因?yàn)樗?jiǎn)單、直觀。
2.SAX則是以事件作為解析XML文件的模式,它將XML文件轉(zhuǎn)化成一系列的事件,由不同的事件處理器來(lái)決定如何處理。XML文件較大時(shí),選擇SAX技術(shù)是比較合理的。雖然代碼量有些大,但是它不需要將所有的XML文件加載到內(nèi)存中。這樣對(duì)于有限的Android內(nèi)存更有效,而且Android提供了一種傳統(tǒng)的SAX使用方法以及一個(gè)便捷的SAX包裝器。 使用Android.util.Xml類,從示例中可以看出,會(huì)比使用 SAX來(lái)得簡(jiǎn)單。
3.XML pull解析并未像SAX解析那樣監(jiān)聽(tīng)元素的結(jié)束,而是在開(kāi)始處完成了大部分處理。這有利于提早讀取XML文件,可以極大的減少解析時(shí)間,這種優(yōu)化對(duì)于連接速度較漫的移動(dòng)設(shè)備而言尤為重要。對(duì)于XML文檔較大但只需要文檔的一部分時(shí),XML Pull解析器則是更為有效的方法。