解析XML的幾種方式:DOM、SAX、PULL

以下內(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解析步驟:

  1. 創(chuàng)建解析器工廠
  2. 獲得解析器工廠
  3. 接受一個(gè)xml文檔作為輸入?yún)?shù)名,并得到一個(gè)xml的文檔對(duì)象(Document)
  4. 操作文檔對(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解析步驟:

  1. 創(chuàng)建解析器對(duì)象
    XmlPullParser paser = Xml.newPullParser();
  2. 進(jìn)行解析
    paser.setInput(input,"utf-8");
  3. 產(chǎn)生第一個(gè)解析事件
    int eventType = paser.getEventType();
  4. 可以使用循環(huán)判斷是否繼續(xù)解析
    while(eventType!=XmlPullParser.END_DOCUMENT){}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容