1. 程式人生 > >android之Xml的高效解析方式——pull

android之Xml的高效解析方式——pull

我們知道,解析XML在各個平臺使用也非常廣泛,android也是一樣,經常會涉及到XML的解析讀取,解析方式主要有三種:SAX解析器、DOM解析器和PULL解析器。
SAX解析器:它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的,也就是ContentHandler為重要核心,解析過程中每遇到一個事件源,只有呼叫事件解析器才能得到相應的處理;不過它的優點主要是解析速度快,佔用記憶體少。非常適合在Android移動裝置中使用;
DOM解析器:dom解析的原理是基於樹形的結構和資訊資料集合,將檔案分為獨立的元素、屬性和註釋等,然後以節點樹的形式在記憶體中對XML檔案進行表示,利用DOM中的物件,可以對XML文件進行讀取、搜尋、修改、新增和刪除等操作。
PULL解析器:PULL解析器的執行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的程式碼。PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動裝置中使用,Android系統內部在解析各種XML時也是用PULL解析器。

接下來我們重點了解一下PULL解析器的簡單使用方式:

首先我們在assets中放入一個xml檔案:
這裡寫圖片描述

接下來我們就通過pull的方式讀取xml中幾個控制元件的ID名稱,這裡要注意的是,呼叫pullParser.getAttributeValue()時,通常我們可以根據傳入的數字下表可以取出標籤的屬性值,也就是pullParser.getAttributeValue(1),但是如果你想要根據屬性名稱獲取屬性值的話,就得寫成:pullParser.getAttributeValue(null, "id")。ok,下面我們直接看完整的程式碼演示:

public class MainActivity
extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_text = (TextView) findViewById(R.id.tv_text); try { //得到XML解析器 XmlPullParser pullParser = Xml.newPullParser(); InputStream is = getAssets().open("activity_main.xml"
); pullParser.setInput(is, "utf-8"); //得到事件型別 int eventType = pullParser.getEventType(); //文件的末尾 //遍歷內部的內容 StringBuilder stringBuilder = new StringBuilder(); while (eventType != XmlPullParser.END_DOCUMENT) { String name = pullParser.getName(); if (!TextUtils.isEmpty(name)) if (eventType == XmlPullParser.START_TAG) { String attributeValue = pullParser.getAttributeValue(null, "id"); attributeValue = attributeValue.substring(attributeValue.indexOf("/") + 1, attributeValue.length()); stringBuilder.append("name===="); stringBuilder.append(name); stringBuilder.append("\t\tid===="); stringBuilder.append(attributeValue); stringBuilder.append("\n\n"); } eventType = pullParser.next();//讀取下一個標籤 } tv_text.setText(stringBuilder.toString()); } catch (Exception e) { e.printStackTrace(); } } }

執行效果如下:
這裡寫圖片描述