Android開發基礎之XML解析


   在androd手機中處理xml數據時很常見的事情,通常在不同平臺傳輸數據的時候,我們就可能使用xmlxml是與平臺無關的特性,被廣泛運用於數據通信中,那麼在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包中ContentHanderDTDHanderErrorHandler,以及EntityResolver4個接口
XMLReader通過相應事件處理器註冊方法setXXXX()來完成的與ContentHanderDTDHanderErrorHandler,以及EntityResolver4個接口的連接,詳細介紹請見表1。
但是我們無需都繼承這4個接口,SDK爲我們提供了DefaultHandler類來處理,DefaultHandler類的一些主要事件回調方法,詳細介紹請見表2。
由以上可知,我們需要XmlReader以及DefaultHandler來配合解析xml
    處理思路是:
        1:創建SAXParserFactory對象
        2: 根據SAXParserFactory.newSAXParser()方法返回一個SAXParser解析器
        3:根據SAXParser解析器獲取事件源對象XMLReader
        4:實例化一個DefaultHandler對象
        5:連接事件源對象XMLReader到事件處理類MyDefaultHandler
        6:調用XMLReaderparse方法從輸入源中獲取到的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.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章