前言
前面已經介紹了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。說也不太好說清楚,畫個圖解釋一下更直覺。
從圖上可以看出,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和PULL、SAX不一樣,是文檔模型形式的,在解析的時候會把整個XML的内容都讀取到記憶體中,這樣對于移動裝置而言,是很消耗記憶體的。而PULL以及SAX都是事件驅動,逐行去解析XML的内容,相對而言保證了解析速度又不會很損耗記憶體。是以Android應用中一般不推薦使用DOM解析XML,還是偏向于使用SAX、PULL。但是DOM也有它的優點,正因為它是把整個文檔都讀取到記憶體中了,可以指定需要查找的資料而無需周遊所有的節點,對于内容比較少的XML而言,還是很友善的。是以解析XML的方法有很多,無法絕對的說明誰好誰壞,主要還是看需求設定的環境來取舍的。
本文轉自承香墨影部落格園部落格,原文連結:http://www.cnblogs.com/plokmju/p/android_DOMforXML.html,如需轉載請自行聯系原作者