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