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();
}
}
}
執行效果如下: