以下內(nèi)容整理自互聯(lián)網(wǎng)囚痴,僅用于個人學(xué)習(xí)
DOM解析
解析器讀入整個文檔,然后構(gòu)建一個主流內(nèi)存的樹結(jié)構(gòu)审葬,然后代碼就可以使用dom接口來操作這個樹結(jié)構(gòu)深滚。
優(yōu)點:
- 整個文檔樹在內(nèi)存中,便于操作涣觉;支持刪除痴荐、修改、重新排列等多種功能官册。
- 通過樹形結(jié)構(gòu)存取xml文檔生兆。
- 可以隨時訪問到某個節(jié)點的相鄰節(jié)點。
缺點:
- 將整個文檔調(diào)入內(nèi)存(包括無用的節(jié)點)膝宁,浪費(fèi)時間和空間鸦难。
適用于: 一旦解析了文檔還需多次訪問這些數(shù)據(jù);硬件資源充足(內(nèi)存员淫,cpu)
DOM解析步驟:
- 創(chuàng)建解析器工廠
- 獲得解析器工廠
- 接受一個xml文檔作為輸入?yún)?shù)名合蔽,并得到一個xml的文檔對象(Document)
- 操作文檔對象
SAX解析
SAX是一個解析速度快并且占用內(nèi)存少的xml解析器,非常適合用于android等移動設(shè)備满粗。
SAX解析xml是基于事件流的處理方式的。因此每解析到一個標(biāo)簽愚争,它并不會記錄這個標(biāo)簽之前的信息映皆,而我們只會知道當(dāng)前這個標(biāo)簽的名字和它的屬性挤聘,至于標(biāo)簽里面的嵌套,上層標(biāo)簽的名字這些都是無法知道的捅彻。
Sax的工作原理簡單的說组去,就是對文檔進(jìn)行順序掃描,掃描到文檔(document)開始與結(jié)束步淹,掃描到元素(element)開始从隆、結(jié)束等地方時調(diào)用事件處理處理函數(shù)做相應(yīng)動作,然后繼續(xù)掃描缭裆,直到文檔結(jié)束键闺。
SAX解析xml最重要的步驟就是定義一個我們自己的Handler處理類,我們可以讓其繼承 DefaultHandler這個類澈驼,然后在里面重寫5個回調(diào)方法辛燥。
- startDocument
- startElement
- characters
- endElement
- endDocument
SAX特點:
- 解析效率高,占用內(nèi)存少
- 可以隨時停止解析
- 不能載入整個文檔到內(nèi)存
- 不能寫入xml
- SAX解析xml文件采用的是事件驅(qū)動
SAX解析過程:
- 繼承DefaultHandler ,并實現(xiàn)方法
- 創(chuàng)建SAX解析器工廠
- 獲得解析器
- 獲得輸入流
- 使用輸入流缝其,和實現(xiàn)接口作參數(shù)挎塌,調(diào)用解析器的解析方法進(jìn)行解析
PULL解析
pull解析器是android內(nèi)置的解析器,解析原理與sax類似内边。
pull與sax的不同之處:
- pull讀取xml文件后觸發(fā)相應(yīng)的事件調(diào)用方法返回的是數(shù)字榴都。
- SAX解析器的工作方式是自動將事件推入注冊的事件處理器進(jìn)行處理,因此你不能控制事件的處理主動結(jié)束漠其;而Pull解析器的工作方式為允許你的應(yīng)用程序代碼主動從解析器中獲取事件嘴高,正因為是主動獲取事件,因此可以在滿足了需要的條件后不再獲取事件辉懒,結(jié)束解析阳惹。
Pull解析步驟:
- 創(chuàng)建解析器對象
XmlPullParser paser = Xml.newPullParser(); - 進(jìn)行解析
paser.setInput(input,"utf-8"); - 產(chǎn)生第一個解析事件
int eventType = paser.getEventType(); - 可以使用循環(huán)判斷是否繼續(xù)解析
while(eventType!=XmlPullParser.END_DOCUMENT){}