Android中解析XML

發表於2015-04-08

XML在各種開發中都廣泛應用,Android也不例外。作為承載資料的一個重要角色,如何讀寫XML成為Android開發中一項重要的技能。今天就由我向大家介紹一下在Android平臺下幾種常見的XML解析和建立的方法。

在Android中,常見的XML解析器分別為SAX解析器、DOM解析器和PULL解析器,下面,我將一一向大家詳細介紹。

SAX解析器:

SAX(Simple API for XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當事件源產生事件後,呼叫事件處理器相應的處理方法,一個事件就可以得到處理。在事件源呼叫事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態資訊,這樣事件處理器才能夠根據提供的事件資訊來決定自己的行為。

SAX解析器的優點是解析速度快,佔用記憶體少。非常適合在Android移動裝置中使用。

DOM解析器:

DOM是基於樹形結構的的節點或資訊片段的集合,允許開發人員使用DOM API遍歷XML樹、檢索所需資料。分析該結構通常需要載入整個文件和構造樹形結構,然後才可以檢索和更新節點資訊。

由於DOM在記憶體中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文件,解析和載入整個文件將會很耗資源。

PULL解析器:

PULL解析器的執行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的程式碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動裝置中使用,Android系統內部在解析各種XML時也是用PULL解析器。

以上三種解析器,都是非常實用的解析器,我將會一一介紹。我們將會使用這三種解析技術完成一項共同的任務。

我們新建一個專案,專案結構如下:

我會在專案的assets目錄中放置一個XML文件books.xml,內容如下:

然後我們分別使用以上三種解析技術解析文件,得到一個List<Book>的物件,先來看一下Book.java的程式碼:

最後,我們還要把這個集合物件中的資料生成一個新的XML文件,如圖:

生成的XML結構跟原始文件略有不同,是下面這種格式:

接下來,就該介紹操作過程了,我們先為解析器定義一個BookParser介面,每種型別的解析器需要實現此介面。BookParser.java程式碼如下:

好了,我們就該一個一個的實現該介面,完成我們的解析過程。

使用SAX解析器:

SaxBookParser.java程式碼如下:

程式碼中,我們定義了自己的事件處理邏輯,重寫了DefaultHandler的幾個重要的事件方法。下面我為大家著重介紹一下DefaultHandler的相關知識。DefaultHandler是一個事件處理器,可以接收解析器報告的所有事件,處理所發現的資料。它實現了EntityResolver介面、DTDHandler介面、ErrorHandler介面和ContentHandler介面。這幾個介面代表不同型別的事件處理器。我們著重介紹一下ContentHandler介面。結構如圖:

這幾個比較重要的方法已被我用紅線標註,DefaultHandler實現了這些方法,但在方法體內沒有做任何事情,因此我們在使用時必須覆寫相關的方法。最重要的是startElement方法、characters方法和endElement方法。當執行文件時遇到起始節點,startElement方法將會被呼叫,我們可以獲取起始節點相關資訊;然後characters方法被呼叫,我們可以獲取節點內的文字資訊;最後endElement方法被呼叫,我們可以做收尾的相關操作。

最後,我們需要呼叫SAX解析程式,這個步驟在MainActivity中完成:

介面就兩個按鈕,順便給大家貼上:

點選“readXML”按鈕,將會呼叫SAX解析器解析文件,並在日誌臺列印相關資訊:

然後再點選“writeXML”按鈕,將會在該應用包下的files目錄生成一個books.xml檔案:

使用DOM解析器:

DomBookParser.java程式碼如下:

然後再MainActivity中只需改一個地方:

執行結果是一樣的。

使用PULL解析器:

PullBookParser.java程式碼如下:

然後再對MainActivity做以下更改:

和其他兩個執行結果都一樣。

對於這三種解析器各有優點,我個人比較傾向於PULL解析器,因為SAX解析器操作起來太笨重,DOM不適合文件較大,記憶體較小的場景,唯有PULL輕巧靈活,速度快,佔用記憶體小,使用非常順手。讀者也可以根據自己的喜好選擇相應的解析技術。

相關文章