XmlPull 解析器的使用

XML文件的解析方式
    能夠運用在Android系統上解析XML文件的常用有三種方式:DOM、SAX和PULL,其中DOM解析XML是先把XML文件讀進內存中,再通過接口獲取數據,該方法使用相對小的XML文件,移動設備往往受硬件性能影響,如果XML文件比較大使用DOM解析往往效率跟不上;SAX和PULL都是採用事件驅動方式來進行解析,在Android中的事件機制是基於回調函數。
    本例旨在考慮簡單方便性,綜合考慮選擇了PULL解析,PULL解析器是一個開源項目,Android平臺已經內置了PULL解析器,同時Android系統本身也是使用PULL解析器來解析各種XML文檔。
    1、事件回調類型
    PULL解析XML文件時,回調XmlResourceParser內定義表示文檔開頭結束和節點開頭結束的數值(事件回調類型),表示如下:
a.讀取到XML文檔開頭(聲明)返回:XmlPullParser.START_DOCUMENT (0)
b.讀取到XML文檔結束返回:XmlPullParser.END_DOCUMENT (1)
c.讀取到XML節點開始返回:XmlPullParser.START_TAG (2)
d.讀取到XML節點結束返回:XmlPullParser.END_TAG (3)
e.讀取到XML文本返回:XmlPullParser.TEXT (4)
   
2、XmlPullParser有幾個主要方法(更多查閱Android APIs):
a.XmlPullParser.getEventType() : Returns the type of the current event (START_TAG, END_TAG, TEXT, etc.) 【獲取當前事件回調類型】
b.XmlPullParser.getName():For START_TAG or END_TAG events, the (local) name of the current element is returned when namespaces are enabled.【獲取當前節點名字】
c.XmlPullParser.getAttributeValue(int index):Returns the given attributes value.【根據id獲取節點屬性值】
d.XmlPullParser.getAttributeValue(String namespace, String name):Returns the attributes value identified by namespace URI and namespace localName.【根據name獲取節點屬性值】
e.XmlPullParser.netxText():If current event is START_TAG then if next element is TEXT then element content is returned or if next event is END_TAG then empty string is returned, otherwise exception is thrown.【回調節點START_TAG時,通過此方法獲取節點內容】




3、實際編碼中如何使用
    在實際編碼中,主要根據事件回調類型,結合被解析的XML結構進行解析提取數據,PULL解析XML文件的主要模式如下,更具體使用看本文提供的例子:
try {   
    //開始解析事件    
    int eventType = parser.getEventType();   
   
    //處理事件,不碰到文檔結束就一直處理    
    while (eventType != XmlPullParser.END_DOCUMENT) {    
        //因爲定義了一堆靜態常量,所以這裏可以用switch    
        switch (eventType) {   
            case XmlPullParser.START_DOCUMENT:   
                // 不做任何操作或初開始化數據    
                break;   
   
            case XmlPullParser.START_TAG:   
                // 解析XML節點數據    
                // 獲取當前標籤名字    
                String tagName = parser.getName();   
   
                if(tagName.equals("XXXTAGXXX")){   
   
                    // 通過getAttributeValue 和 netxText解析節點的屬性值和節點值    
   
                }   
                break;   
   
            case XmlPullParser.END_TAG:   
                // 單節點完成,可往集合裏邊添加新的數據    
                break;   
            case XmlPullParser.END_DOCUMENT:   
   
                break;   
        }   
   
        // 別忘了用next方法處理下一個事件,不然就會死循環    
        eventType = parser.next();   
    }   
} catch (XmlPullParserException e) {   
    e.printStackTrace();   
}catch (IOException e) {   
    e.printStackTrace();   
}

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