天天看點

Android--解析XML之DOM

前言

  前面已經介紹了Android平台下兩種解析XML的方法,SAX和PULL,這兩個均為事件驅動,以流的形式解析XML文檔。現在介紹一種新的方式DOM方式解析XML。

  DOM是一種用于XML文檔對象模型,可用于直接通路XML文檔的各個部位,在DOM中文檔被模拟成樹狀,其中XML文法的每一組成部分都表示一個節點,DOM允許使用者周遊文檔樹,從父節點移動到子節點和兄弟節點。并利用某節點類型特有的屬性(元素具有屬性,文本節點具有文本資料)。

  對于DOM而言,XML文檔中每一個成分都是一個節點。

  DOM是這樣規定的:

整個文檔是一個文檔節點。

每一個XML标簽是一個元素節點。

包含在XML元素中的文本是一個文本節點。

每一個XML屬性是一個屬性節點。

DOM解析XML

  DOM解析XML也是需要一個工廠類DocumentBuilderFactory,這一點和SAX、PULL類似。工廠類也是單例模式,沒有提供共有的構造函數,需要使用靜态的newInstance()方法獲得,并且需要工廠類來擷取DOM解析器執行個體,使用DocumentBuilderFactory.newDocumentBuilder()獲得的DocumentBuilder對象。

  當獲得Document之後,就可以使用parse()解析XML文檔,parser多個重載,可以适用于不同的輸入。

  下面介紹一下在DOM解析XML過程中,會碰上幾個對象,Element、NodeList、Node。說也不太好說清楚,畫個圖解釋一下更直覺。

Android--解析XML之DOM

  從圖上可以看出,Element為一個元素,可以通過這個元素擷取到該元素的屬性值(Attribute),以及它的子節點的集合NodeList。而NodeList作為一個裝載平級節點的集合,可以通過NodeList獲得它内裝載的所有平級節點,可以通過索引擷取。對于Node,表示最終的節點,根據圖示說的,其實Jack文本也是一個文本節點(Node),Node可以擷取其節點名稱、其值、其屬性。是以它們三個是可以互相嵌套的,也不存在說誰一定要在誰的外側或是内層。

示例程式

  既然已經說了那麼多了,現在通過一個示例程式展示一下DOM解析XML。這是一個Android應用程式,為了模拟真實的環境,通過網絡讀取IIS上的一個靜态XML檔案内容。直接上代碼,注釋已經寫的很清楚了。

  IIS上的靜态XML文檔内容:

<a></a>

  DomService,解析網絡傳輸來的XML文檔流:

  Activity的布局就是一個按鈕,用于點選出發解析事件,因為是Android4.0+的環境,需要無法在主線程中通路網絡,需要使用到多線程的技術,并且不要網了給Android應用增加通路網絡的權限。

  如果解析成功,可以在LogCat中檢視到日志。

Android--解析XML之DOM

總結

  現在已經講解的常用的Android應用中解析XML的方法,DOM和PULL、SAX不一樣,是文檔模型形式的,在解析的時候會把整個XML的内容都讀取到記憶體中,這樣對于移動裝置而言,是很消耗記憶體的。而PULL以及SAX都是事件驅動,逐行去解析XML的内容,相對而言保證了解析速度又不會很損耗記憶體。是以Android應用中一般不推薦使用DOM解析XML,還是偏向于使用SAX、PULL。但是DOM也有它的優點,正因為它是把整個文檔都讀取到記憶體中了,可以指定需要查找的資料而無需周遊所有的節點,對于内容比較少的XML而言,還是很友善的。是以解析XML的方法有很多,無法絕對的說明誰好誰壞,主要還是看需求設定的環境來取舍的。

本文轉自承香墨影部落格園部落格,原文連結:http://www.cnblogs.com/plokmju/p/android_DOMforXML.html,如需轉載請自行聯系原作者

繼續閱讀