Android XML解析學習——Sax方式

一. 簡單介紹

XML eX tensible Markup Language 即可擴展標記語言 是一種簡單的數據存儲語言,使用一系列簡單的標記描述數據 XML 經常用作  Internet  上的一種數據格式 ,因此 如果您希望通過 Internet  訪問數據,則數據很有可能是  XML  格式 ,或者 如果您希望發送數據給 Web  服務,那麼您可能也需要發送  XML 。簡而言之,如果您的  Android  應用程序將利用  Internet ,那麼您可能需要使用  XML 。幸運的是,您可以採用多種方法在  Android  上使用  XML 。這個學習系列就和大家一起學習一下在 Android平臺上讀寫 XML 數據的多種方式。

而最近用業餘時間做了一個《地震及時通》,其中就需要從網絡上讀取實時的XML 形式的地震數據,因此我們在學習的同時將會完成讀取 XML 形式的地震數據的 Demo 例子。

二. 基礎知識

2.1 整體介紹

Android上對 XML 解析的支持是相當強大的,我們可以先來看一下 Android 中和 XML 解析相關的包:

1.   a ndroid.sax

這是 Android  SDK 提供的sax 解析的包,因爲可以對具體的 Element 設置監聽進行處理,因此有更好魯棒性。

2.   a ndroid.util .Xml

這是 a ndroid.util 包中的其中一個類,提供 XML相關的實用方法,而且都是 public static 形式的類方法,即可以直接以類名調用。

3.  javax.xml.parsers

這是使用原來Java  SDK 用於xml 處理的 API ,即 JAXP( Java API for XML Processing ),主要提供了 SAX DOM 方式解析 XML 的工廠方法。

4.  org.w3c.dom

提供具體的和DOM 方式解析 XML 相關的接口,如 Document Element 等。

5.  org.xml.sax

提供具體的和SAX 方式解析 XML 相關的接口,如 XMLReader 4 個處理用的 Handler 等。

6.  org.xml.sax.helpers

提供SAX 的幫助類,以便更方便的用來解析,比如實現了 SAX 4 個處理用的 Handler 接口的 DefaultHandler ,用來更方便使用 XML 過濾器 XMLFilter XMLFilterImpl ,和用於更方便創建 XMLReader XMLReaderFactory 等。

7.  org.xmlpull.v1

提供Pull 方式解析 XML 的接口 XmlPullParser 和用於寫 XML XmlSerializer 等。

以上就是Android 提供的和 XML 讀寫相關的一些包,在這個學習系列中我們將對這些包的功能進行具體的介紹,並依次使用這些 SAX 解析的方式完成讀取 XML 地震數據的 Demo 例子。

 

2.2 SAX方式介紹

SAX Simple API for XML 基於 事件驅動的 XML  處理 模式, 主要是圍繞着事件源以及事件處理器(或者叫監聽器)來工作的。一個可以產生事件的對象被稱爲事件源,而可以針對事件產生響應的對象就被叫做事件處理器。事件源和事件處理器是通過在事件源中的事件處理器註冊方法連接的。這樣當事件源產生事件後 (比如碰到 XML元素的開始和結束等 ,調用事件處理器 (由許多回調函數組成) 相應的處理方法,一個事件就獲得了處理。當然在事件源調用事件處理器中特定方法的時候,會傳遞給事件處理器相應事件的狀態信息 (即回調函數中的參數) ,這樣事件處理器才能夠根據事件信息來決定自己的行爲。

其中常用的事件處理回調函數有用於文檔處理的文檔開始: startDocument() ,文檔結束: endDocument () XML元素開始: startElement(String uri, String localName, String qName, Attributes attributes) XML元素內容: characters( char [] ch,  int  start,  int  length) XML元素結束: endElement(String uri, String localName, String qName) ,還有解析錯誤的回調函數 error ( SAXParseException  exception) 等。

Android 系統中,提供了兩種 SAX 解析的包,一種是原來 Java  SDK 就有的用於XML 處理的 API (稱爲 JAXP Java API for XML Processing ,包含了 SAX DOM 兩者相關的 API ),相關內容在包 javax.xml.parsers 中。還有一種是經過了 Android  SDK 包裝了之後的sax 包,相關內容在包 android.sax 中。

這部分我們先來學習原來Java  SDK 就有的用SAX 方式處理 XML 的相關方法。在 javax.xml.parsers 包中,和 SAX 相關的爲兩個類: SAX 解析器工廠 SAXParserFactory SAX解析器 SAXParser SAXParserFactory set方法和 get 方法 可以設置和獲取一些配置選項,其中最重要的是調用 newSAXParser() 創建解析器 SAXParser 類的實例。 SAXParser 類包裝了底層的 SAX解析器( org.xml.sax.XMLReader 的實例 ),即 SAXParser 實例調用 parse方法進行 XML 解析時,實際上會調用底層具體的 org.xml.sax 包中的 XMLReader SAXParser 實例也可以通過調用 getXMLReader()方法獲得底層的 XMLReader 實例,一旦獲得該實例,就可以按 XMLReader 方式使用更一般和具體的 SAX 方法。

通過以上的介紹我們知道 org.xml.sax 包是底層具體的負責 SAX解析相關的內容,並且爲上層 javax.xml.parsers包提供 SAX 解析器等相關調用。下面我們就具體介紹一下用 SAX 進行解析的步驟。

SAX 接口中,事件源是 org.xml.sax 包中的 XMLReader ,它通過 parse() 方法來開始解析 XML 文檔並根據文檔內容產生事件。而事件處理器則是 org.xml.sax 包中的 ContentHandler,DTDHandler,ErrorHandler, 以及  EntityResolver 這四個接口。它們分別處理事件源在解析過程中產生的不同種類的事件(其中 主要的爲 ContentHandler ,處理和文檔內容相關的事件 )。 而事件源XMLReader 和這四個事件處理器的連接是通過在 XMLReader 中的相應的事件處理器註冊方法 set***() 來完成的。

因此概況一下具體步驟爲:

1.  實現一個或多個處理器接口(ContentHandler, ErrorHandler, DTDHandler ,or EntityResover)

2.  創建一個XMLReader 類的實例

3.  在新的XMLReader 實例中通過大量的 set*****()  方法註冊一個事件處理器的實例

4.  調用XMLReader parse() 方法來處理文檔 啓動解析

 

以上部分的介紹是指使用 org.xml.sax包中提供的 SAX 解析的相關接口時的用法,但是一般常用並且比較方便的爲使用 javax.xml.parsers 包提供的 SAX 工廠類 SAXParserFactory 創建 SAXParser 實例, 並且創建一個繼承 org.xml.sax.helpers包中的 DefaultHandler 的類,用於實現具體的 SAX 事件的處理邏輯, DefaultHandler 類提供了 SAX ContentHandler,DTDHandler,ErrorHandler,以及  EntityResolver 這四個接口 的所有回調方法默認的空實現,因此我們繼承這個類後可以只覆蓋我們需要的回調函數即可。然後調用 SAXParser 實例的 parse方法進行解析,用來解析的 xml 數據的形式可以爲 InputStreams, Files, URLs, and SAX InputSources 等四種形式。

實現步驟和上面類似:

1.  在繼承DefaultHandler 的類裏面重寫需要的回調函數

2.  創建 SAXParser 實例

3.  SAXParser 實例 調用parse 方法啓動解析

 

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

三. 實例開發

我們要解析的爲美國地質調查局USGS 提供的地震數據, xml 數據地址爲:

http://earthquake.usgs.gov/earthquakes/catalogs/1day-M2.5.xml

http://earthquake.usgs.gov/earthquakes/catalogs/7day-M2.5.xml

http://earthquake.usgs.gov/earthquakes/catalogs/7day-M5.xml

分別爲1 天以內 2.5 級以上、 7 天內 2.5 級以上和 7 天內 5 級以上地震數據。

Xml數據的格式如下所示:

下面我們就來完成用Java SAX 的方式解析以上 XML 形式的 USGS 地震數據的 Android 例子。

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

1 ListView 列表顯示的地震數據

解析完地震數據後用ListView 列表的方式顯示每條地震的震級和地名信息。

新建一個Android 工程 AndroidXMLDemoSax

首先新建添加一個類EarthquakeEntry ,用來保存一條地震信息,類的內容爲:

比較簡單,定義和一條地震內容對應的變量,並設置set get 函數,並且重寫 toString ()函數在 ListView 輸出時用。

 

接着新建添加一個類SaxEarthquakeHandler ,繼承 DefaultHandler ,完成解析地震數據的具體邏輯實現,內容如下:

首先定義了 xml解析和保存解析結果等相關的一些變量,接着定義一個 get 函數

//獲取解析的地震列表

public  ArrayList<EarthquakeEntry> getEarthquakeEntryList()

{

return   this . earthquakeEntryList ;

}

返回解析的地震列表數據。

然後就是具體的xml 解析回調函數的重寫實現,因爲繼承了類 DefaultHandler ,包含了 SAX 處理相關的 4 Handler 的所有回調函數的空實現,因此我們只需覆蓋我們需要的回調函數。這是我們只重寫了和文檔內容處理相關的 ContentHandler startDocument endDocument startElement characters ,和 endElement 這幾個回調函數,在實際應用中你可能還需添加錯誤處理或者其他的回調函數,只需重寫覆蓋即可。

回調函數中具體的處理邏輯和你的XML 數據的內容有關,以上實現瞭解析 USGS 的地震數據的處理邏輯,並添加了註釋,如果有興趣你可以對照着 USGS XML 數據格式來看,這就不具體的講了。

和地震相關的存儲類和SAX 處理回調函數都完成了,接下來我們就來調用 SaxEarthquakeHandler 開始解析並顯示數據。

先修改res/layout 下的 main.xml 爲:

 

添加了一個用於顯示的ListView 控件。

接着添加AndroidXMLDemoSax.java 文件的內容。

先添加獲取xml 數據源的方法:

這是從 USGS的網站上讀取 XML 數據並以 InputStream  的形式返回。因爲需要用到聯網功能,所以還得在 manifest.xml文件中添加聯網權限:

< uses-permission   android:name = "android.permission.INTERNET"   />

這是聯網獲取XML 數據,也可以從本地讀取 XML 數據,因爲校園網會打不開 USGS 的網站,因此複製了一份 USGS 的地震數據以文件的形式保存在 assets 文件夾下,並使用如下函數讀取:

有了XML 數據,就可以接下來進行解析了。

最後添加定義相關變量,用把解析的數據用ListView 顯示:

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

 

以上使用的是javax.xml.parsers 包中的 SAXParser 來實現, SAXParser 包裝了底層的 XMLReader ,實現起來更加方便。但是我們也可以使用 XMLReader 來實現解析,下面就看下使用具體的 XMLReader 的方式,實現代碼如下所示:

其中獲取XMLReader 的方式有兩種,一種是先獲取 SAXParser ,然後通過 getXMLReader() 方法來獲取,

xmlReader = SAXParserFactory.newInstance().newSAXParser().getXMLReader();

另一種是直接使用XMLReader 的工廠類 XMLReaderFactory 調用 createXMLReader() 方法創建,

xmlReader = XMLReaderFactory. createXMLReader ();

不管是那種方式,只有獲得了XMLReader 實例,接下來的操作都是一樣的,先註冊文檔內容的事件處理器實例,

xmlReader.setContentHandler(saxHandler);

然後調用parse方法開始解析,

xmlReader.parse(inSource);

這樣就用XMLReader進行了XML解析。

四. 總結

在這部分中我們首先學習了Android 上和 XML 解析相關的各個包的簡單介紹,並且從有這麼多個相關的包我們可以知道 Android XML 的讀寫提供了相當大的支持。

然後具體學習了Android 上使用 SAX 方式解析 XML 的基本知識,使用 javax.xml.parsers 包中的 SAXParser 進行解析,及使用 org.xml.sax 包中的 XMLReader 進行解析兩種方式分別的步驟,最後用解析 USGS 地震數據的 Demo 例子來實現介紹的內容。

這部分介紹的SAX 方式是屬於原來 Java 就有的 XML 處理方式,同時, Android 平臺爲了使解析 XML 還能更加方便和更加健壯,提供了 android.sax 包來進行 SAX 進行 XML ,這部分內容我們以後我們繼續接着學習。

 

注:

參考資料: http://www.ibm.com/developerworks/cn/xml/x-saxhandle/

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