在androd手機中處理xml數據時很常見的事情,通常在不同平臺傳輸數據的時候,我們就可能使用xml,xml是與平臺無關的特性,被廣泛運用於數據通信中,那麼在android中如何解析xml文件數據呢?
通常有三種方式:DOM,SAX,PULL
DOM方式來處理
DOM方式解析xml是先把xml文檔都讀到內存中,然後再用DOM
API來訪問樹形結構,並獲取數據的,但是這樣一來,如果xml文件很大呢?手機CPU處理能力當然不能與PC機器比,因此在處理效率方面就相對差了,當然這是對於其他方式處理xml文檔而言。
那麼如何處理呢?
具體思路是:
*首先利用DocumentBuilderFactory創建一個DocumentBuilderFactory實例
*然後利用DocumentBuilderFactory創建DocumentBuilder
*然後加載XML文檔(Document),
* 然後獲取文檔的根結點(Element),
* 然後獲取根結點中所有子節點的列表(NodeList),
* 然後使用再獲取子節點列表中的需要讀取的結點。
SAX方式解析 SAX即是:Simple API for XML
SAX是基於事件驅動的。當然android的事件機制是基於回調函數的,在用SAX解析xml文檔時候,在讀取到文檔開始和結束標籤時候就會回調一個事件,在讀取到其他節點與內容時候也會回調一個事件。
既然涉及到事件,就有事件源,事件處理器。在SAX接口中,事件源是org.xml.sax包中的XMLReader,它通過parser()方法來解析XML文檔,併產生事件。事件處理器是org.xml.sax包中ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個接口
XMLReader通過相應事件處理器註冊方法setXXXX()來完成的與ContentHander、DTDHander、ErrorHandler,以及EntityResolver這4個接口的連接,詳細介紹請見表1。
但是我們無需都繼承這4個接口,SDK爲我們提供了DefaultHandler類來處理,DefaultHandler類的一些主要事件回調方法,詳細介紹請見表2。
由以上可知,我們需要XmlReader以及DefaultHandler來配合解析xml。
處理思路是:
1:創建SAXParserFactory對象
2:
根據SAXParserFactory.newSAXParser()方法返回一個SAXParser解析器
3:根據SAXParser解析器獲取事件源對象XMLReader
4:實例化一個DefaultHandler對象
5:連接事件源對象XMLReader到事件處理類MyDefaultHandler中
6:調用XMLReader的parse方法從輸入源中獲取到的xml數據
7:通過MyDefaultHandler返回我們需要的數據集合。
PULL方式解析
這種方式也是基於事件驅動的,與SAX方式一樣
只不過PULL方式讀xml回調方法返回的是數字。
讀取到xml的聲明返回 START_DOCUMENT;
讀取到xml的結束返回 END_DOCUMENT ;
讀取到xml的開始標籤返回START_TAG
讀取到xml的結束標籤返回END_TAG
讀取到xml的文本返回 TEXT
xml數據結果還是採用我們先前使用的river.xml文件。
採用PULL方式與SAX大同小異,重點在於我們需要知道導航到什麼標籤時候做什麼就行了,依據上一節SAX處理方式的思路,我們也可以在這一節中一樣處理,基本方法是:
基本處理方式是:當PULL解析器導航到文檔開始標籤時就開始實例化list集合用來存貯數據對象。導航到元素開始標籤時回判斷元素標籤類型,如果是標籤,則需要實例化對象了,如果是其他類型,則取得該標籤內容並賦予對象。當然它也會導航到文本標籤,不過在這裏,我們可以不用。
根據以上的解釋,我們可以得出以下處理xml文檔邏輯:
1:當導航到XmlPullParser.START_DOCUMENT,可以不做處理,當然你可以實例化集合對象等等。
2:當導航到XmlPullParser.START_TAG,則判斷是否是目標標籤,如果是,則實例化目標對象,並調用getAttributeValue方法獲取標籤中屬性值。
3:當導航到其他標籤的時候,則判斷目標對象是否爲空,如不爲空,則取出標籤中的內容,nextText方法來獲取文本節點內容
4:當然啦,它一定會導航到XmlPullParser.END_TAG的,有開始就要有結束嘛。在這裏我們就需要判讀是否是目標結束標籤,如果是,則把目標象存進list集合中了,並設置目標對象爲null.