Android XML解析學習——Pull方式

一.基礎知識

通過前面的學習我們已經知道了Android上使用SAXDOM方式解析XML的方法,並且對兩種做了簡單的比較,通過比較我們知道對在往往內存比較稀缺的移動設備上運行的Android系統來說,SAX是一種比較合適的XML解析方式。

但是SAX方式的特點是需要解析完整個文檔纔會返回,如果在一個XML文檔中我們只需要前面一部分數據,但是使用SAX方式還是會對整個文檔進行解析,儘管XML文檔中後面的大部分數據我們其實都不需要解析,因此這樣實際上就浪費了處理資源。

就以USGS的地震數據爲例,USGS網上的這個數據是定時更新的,但是一次更新往往只更新前面幾條地震數據,大部分數據還是相同的,因此我們在解析時可以在上一次解析的結果之上根據<updated>元素標籤中的值解析前面幾條比之前updated值更新的地震數據即可。但是如果使用SAX方式的話,每次還是都會解析整個XML文檔,而這卻浪費了處理器資源和延長了處理的時間。

不過Android系統還提供了另一種XML解析方式可以使你更好的處理這種情況,就是Pull方式解析XML數據。

Pull解析器和SAX解析器雖有區別但也有相似性。他們的區別爲:SAX解析器的工作方式是自動將事件推入註冊的事件處理器進行處理,因此你不能控制事件的處理主動結束;而Pull解析器的工作方式爲允許你的應用程序代碼主動從解析器中獲取事件,正因爲是主動獲取事件,因此可以在滿足了需要的條件後不再獲取事件,結束解析。這是他們主要的區別。

而他們的相似性在運行方式上,Pull解析器也提供了類似SAX的事件(開始文檔START_DOCUMENT和結束文檔END_DOCUMENT,開始元素START_TAG和結束元素END_TAG,遇到元素內容TEXT等),但需要調用next() 方法提取它們(主動提取事件)。

Android系統中和Pull方式相關的包爲org.xmlpull.v1,在這個包中提供了Pull解析器的工廠類XmlPullParserFactoryPull解析器XmlPullParserXmlPullParserFactory實例調用newPullParser方法創建XmlPullParser解析器實例,接着XmlPullParser實例就可以調用getEventType()next()等方法依次主動提取事件,並根據提取的事件類型進行相應的邏輯處理。

 

下面我們就用上面介紹的Pull方式來實現解析XML形式的USGS地震數據的Demo例子。

二.實例開發

我們要完成的效果圖如下圖1所示:

 

 

1 ListView列表顯示的地震數據

和上一部分Demo例子的一樣,也是解析完地震數據後用ListView列表的方式顯示每條地震的震級和地名信息。

新建一個Android工程AndroidXMLDemoPull

要添加的基本內容和上一個Demo中的一樣,這裏就不再贅述,這次要添加的解析器新類爲PullEarthquakeHandler,內容如下所示:

 

 

程序首先也是定義解析用到的變量,在定義的用於解析xml數據的方法中

public ArrayList<EarthquakeEntry> parse(InputStream inStream)

定義了一個局部變量

boolean isDone = false; 

用於標誌在有滿足條件時停止讀取XML文檔,退出解析過程。

主體部分首先創建XmlPullParser

 

創建XmlPullParser有兩種方式,一種是使用我們介紹的org.xmlpull.v1包中的工廠類XmlPullParserFactory。除了這種方式外,還可以使用Android SDK提供的實用工具包android.util中的類XmlnewPullParser()方法直接創建。

接着爲pull解析器設置要解析的xml文檔數據,並使用主動的方式獲取解析器中的事件,

事件將作爲數值代碼被髮送,因此可以使用一個簡單 case-switch或者if-else對事件的類型(START_TAG, END_TAG, TEXT或者其他等)進行判斷,並根據對應的事件類型實現相應的處理邏輯。解析並未像 SAX 解析那樣監聽元素的結束,而是在開始處(START_TAG)完成了大部分處理,因爲當某個元素開始時,可以調用 解析器實例的nextText() XML 文檔中提取所有字符數據,

currentData = xmlPullParser.nextText();

當一個事件處理完成後,可以調用next()方法主動從解析器中獲取下一個事件,

eventType = xmlPullParser.next();

整個過程可以放在一個while循環中,直到碰到XML文檔的結束事件,

while ((eventType != XmlPullParser.END_DOCUMENT)&&(isDone != true))

或者是設置的條件滿足主動停止解析過程,可以看到在上面的while條件中除了碰到文檔結束的條件外,

(eventType != XmlPullParser.END_DOCUMENT)

還有設置的標誌是否滿足的條件,

(isDone != true)

設置一個標記(布爾變量 isDone)來確定何時到達感興趣內容的結束部分,允許我們提早停止讀取 XML 文檔,因爲我們知道代碼將不會關心文檔的其餘部分。這有時非常實用,特別是當我們只需要訪問一小部分 XML 文檔時。通過儘快停止解析,我們可以極大地減少解析時間。這種優化對於Android系統運行的速度較慢的移動設備尤爲重要。因此Pull解析器可以提供一些性能優勢以及易用性。

最後添AndroidXMLDemoPull.java文件中的內容,內容和前一個Demo工程AndroidXMLDemoDom中的AndroidXMLDemoDom.java基本一樣,

 

只是把進行XML解析的部分換成了如下方式:

完成了,可以保存運行看下效果。

 

三.總結

在這部分中我們學習了Android平臺上除了SAXDOM方式外的第三種解析XML的方式,即使用Pull解析器的方式,並且介紹了Pull方式和SAX方式比較的特點,就是可以在程序中使用代碼主動從解析器中提取事件且可以提前停止XML文檔的解析。並用這個方式完成了一個解析USGS地震數據的Demo例子。

這樣我們就學習了Android平臺上的三種解析XML的方式:SAXDOMPull,這三種方式除了我們已經學習過的各自的特點外,他們的性能比較如何?那個解析的速度最快?這部分內容我們以後接着學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章