android 解析xml -XmlPullParser

原文地址:http://blog.sina.com.cn/s/blog_8a86f4dd01017id9.html


在Android中常用的XML解析器有三種,分別爲DOM解析器、SAX解析器和PULL解析器,下面是PULL解析器的方式。爲什麼要學習PULL解析器呢?因爲PULL解析是在XML文檔中尋找想要的標記,把需要的內容拉入內存,而不是把整個文檔都拉入內存,這種方式比較適合手機等內存有限的小型的移動設備。
    Android並未提供對Java StAX API的支持。但是,Android附帶了一個pull解析器,其工作方式類似於StAX。它允許用戶的應用程序代碼從解析器中獲取事件,這與SAX解析器自動將事件推入處理程序相反。

    PULL解析器的運行方式和SAX類似,都是基於事件的模式。不同的是,在PULL解析過程中返回的是數字,且我們需要自己獲取產生的事件然後做相應的操作,而不像SAX那樣由處理器觸發一種事件的方法,執行我們的代碼。

讀取到xml的聲明返回 START_DOCUMENT;

讀取到xml的結束返回 END_DOCUMENT ;

讀取到xml的開始標籤返回 START_TAG

讀取到xml的結束標籤返回 END_TAG

讀取到xml的文本返回 TEXT

 

    PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設備中使用,Android系統內部在解析各種XML時也是用PULL解析器,Android官方推薦開發者們使用Pull解析技術。Pull解析技術是第三方開發的開源技術,它同樣可以應用於JavaSE開發。

     PULL 的工作原理:XML pull提供了開始元素和結束元素。當某個元素開始時,我們可以調用parser.nextText從XML文檔中提取所有字符數據。當解釋到一個文檔結束時,自動生成EndDocument事件。

     常用的XML pull的接口和類:

XmlPullParser:XML pull解析器是一個在XMLPULL VlAP1中提供了定義解析功能的接口。

XmlSerializer:它是一個接口,定義了XML信息集的序列。

XmlPullParserFactory:這個類用於在XMPULL V1 API中創建XML Pull解析器。

XmlPullParserException:拋出單一的XML pull解析器相關的錯誤。

嘗試解析以下XML:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="1">
<name>john</name>
<age>23</age>
</person>
<person id="2">
<name>david</name>
<age>233</age>
</person>
</persons>

個人備註:
(1) 獲取id 這種元素的屬性使用:parser.getAttributeValue(null, "id") 可以得到 1這個值
(2) 如果<person name="code">123</person> ,使用: parser.nextText() 可以得到 123 這值


下面就是解析XML文檔的方法:
package com.davidw.xmlandr;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.content.Context;
import android.util.Log;
import android.util.Xml;

public class XMLPaser {

	static final String TAG = "XMLPaser";
	private static final String ns = null;
	private Context context;

	public XMLPaser(Context context) {
		this.context = context;
	}

	public List<Person> parse(String xmlPath) {
		List<Person> psonList = new ArrayList<Person>();
		Person person = null;
		InputStream stream = null;
		// get xml parser
		XmlPullParser xmlParse = Xml.newPullParser();
		try {
			// get file stream and set encoding
			stream = this.context.getResources().getAssets().open(xmlPath);
			xmlParse.setInput(stream, "utf-8");
			// get event type
			int evnType = xmlParse.getEventType();
			// continue to end document
			while (evnType != XmlPullParser.END_DOCUMENT) {
				switch (evnType) {
				case XmlPullParser.START_TAG:
					String tag = xmlParse.getName();
					if (tag.equalsIgnoreCase("person")) {
						person = new Person();
						person.setId(Integer.parseInt(xmlParse
								.getAttributeValue(ns, "id")));
					} else if (person != null) {
						// parse after tag
						if (tag.equalsIgnoreCase("name")) {
							person.setName(xmlParse.nextText());
						} else if (tag.equalsIgnoreCase("age")) {
							person.setAge(Integer.parseInt(xmlParse.nextText()));
						}
					}
					break;
				case XmlPullParser.END_TAG:
					if (xmlParse.getName().equalsIgnoreCase("person")
							&& person != null) {
						psonList.add(person);
						person = null;
					}
					break;
				default:
					break;
				}
				evnType = xmlParse.next();
			}
		} catch (Exception e) {
			Log.d(TAG, e.toString());
		}
		return psonList;
	}
}





       


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