文章目錄
- 基於事件驅動的處理模式
- 按照應用程式開發的流程,簡要介紹下SAX的使用方法
- 總結說明
註明:本文轉自 http://www.moandroid.com.
前面在Android讀寫XML(上)——package說明中,詳細介紹了使用 DOM方法讀取XML文檔,由於使用DOM方法需要將整個XML文檔載入記憶體中,對系統資源佔用比較多,這對記憶體比較緊張的Android系統來說,使用DOM方法讀取XML文檔會有很大的限制。 使用SAX方法讀取XML,對記憶體資源的佔用的比較少,因此在嵌入式裝置中極力推薦使用,Android也不例外,本篇幅詳細說明Android中如何使用SAX讀取XML文檔。
SAX採用基於事件驅動的處理方式,它將XML文檔轉換成一系列的事件,由單獨的事件處理器來決定如何處理。為了瞭解如何使用SAX API處理XML文檔,這裡介紹一下SAX所使用的基於事件驅動的處理模式。
基於事件驅動的處理模式
基於事件的處理模式主要圍繞著事件來源以及事件處理器來工作的。一個可以產生事件的對象被稱為事件來源,而可以對事件產生響應的對象就被叫做事件處理器。事件來源與事件處理對象是通過在事件來源中的事件註冊方法串連的。當事件來源產生時間後,呼叫事件處理器相應的方法,一個事件獲得處理。當在事件來源呼叫事件處理器中特定方法的時候,會傳遞個事件標誌以及其響應事件的狀態資訊,這樣事件處理器才能夠根據事件資訊來決定自己的行為。
在SAX介面中,事件來源是org.xml.sax包中的XMLReader,它通過parser()方法來開始解析XML文檔,並根據文檔的內容產生事件。而事件處理器則是org.xml.sax包中的ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個介面,它們分別處理事件來源在解析XML文檔過程中產生的不同種類的事件。而事件來源XMLReader與這4個事件處理器的串連是通過在XMLReader中的相應事件處理器註冊方法setXXXX()來完成的,詳細介紹請見下表:
以上的4個事件來源處理器介面,在開發中沒有必要直接從這4個介面直接繼承,因為org.xml.sax.helper包為我們提供了類DefaultHandler,其繼承了這4個個介面,在實際開發中直接從DefaultHandler繼承並實現相關函數就可以了。在這4個介面中,最重要的是ContentHanlder介面,下面就其中的方法加以說明,如下:
以上就是解析一個XML文檔,事件處理的過程。這裡我們對org.xml.sax.XMLReader中的方法做下補充說明:除了前面介紹的一系列事件處理器註冊方法set/getXXXX()外,還有個重要的函數:parse(InputSource input)–Parse an XML document,開始解析一個XML文檔。
按照應用程式開發的流程,簡要介紹下SAX的使用方法
- 首先,編寫瞭解XML文檔的結構,按照XML文檔的結構,編寫具體的資料結構,類似於:XXXXList,XXXXItem,最好與XML的文檔保持一致。
- 其次,開始實現事件處理對象,Android SDK為我們提供了DefaultHandler,其繼承了ContentHandler 、DTDHandler、 EntityResolver、 ErrorHandler的所有介面。我們在DefaultHandler的基礎上,按照需求實現ContentHanlder的所有介面,這裡需要注意2個方面的問題:
- 事件處理的順序,處理時間的位置:一般在startDocument()初始化工作,在endDocument()中收尾的處理工作;startElement()—characters()—endDocument()是一個XML節點讀取的過程,startElement()用來初始判斷,characters()擷取節點的字元資料,endDocument()將資料寫入資料結構。
- 異常SAXException的處理;
- 然後,XML實體解析,過程如下:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
URL rrl = new URL(urlstring);
InputSource is = new InputSource(url.openStream());
Xmlreader.setContentHanlder(XXXX);
Xmlreader.parse(is);
- 最後,在Activity中顯示資料,一般先將XML中讀取的資料,選擇合適的Adaper對資料進行封裝,然後使用ListView控制項來顯示資料。
以上就是SAX讀取XML的過程,並顯示出最終的資料。以上需要注意的是SAXParserFactory ,SAXParser類來自 javax.xml.parsers包中。
總結說明
SAX讀取XML文檔的方法,佔用記憶體比較少,但是開發流程相比DOM就複雜多了,具體採用哪種方法比較合適,大家可以在開發的過程中來深刻體會之間的差別。