Android XML文檔解析(三)——Pull解析

------------------------------------------------------------------------------------------------------

       此文章僅作爲學習交流所用

       轉載或引用請務必註明原文地址:

       http://blog.csdn.net/luzhenrong45/article/details/12611993

       或聯繫作者:[email protected] 

       謝謝!                       

------------------------------------------------------------------------------------------------------

 

一.Pull 介紹

   Android開發官網對於Pull的介紹: http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

      Pull解析和Sax解析很相似,都是輕量級的解析,在Android的內核中已經嵌入了Pull,所以我們不需要再添加第三方jar包來支持Pull. Android系統中採用Pull技術解析XML文檔比用SAX技術性能要好得多。建議Android的開發者採用PULL技術解析XML文檔。跟SAX類似,它提供了類似的事件,如開始元素,結束元素事件.只不過PULL技術返回的事件類型是整型,所以我們只要對返回的事件進行處理就行了。Pull解析使用parser.next()可以進入下一個元素並觸發相應事件.調用Pull與SAX不同的是,SAX的事件驅動是回調相應方法,需要提供回調的方法,而後在SAX內部自動調用相應的方法,而Pull解析器並沒有強制要求提供觸發的方法,因爲它觸發的事件並不是一個方法,而是一個常量數字.至於要不要處理,由程序員自己決定,可通過switch方法進行選擇.

    Pull解析器的事件只有5個:

START_DOCUMENT  (常量0)
START_TAG (常量2)
TEXT (常量4)
END_TAG (常量3)
END_DOCUMENT (常量1)

 

二. 使用Pull解析XML步驟

     (1)取得pull解析器

XmlPullParser parser = Xml.newPullParser();

  (2)設置解析器的輸入流

parser.setInput(inStream, "UTF-8");

  (3)產生第一個事件

int eventType=pullParser.getEventType();//觸發第一個事件

  (4)開始解析

判斷是否 是文件開始:XmlPullParser.START_DOCUMENT:
判斷是否是標籤開始:XmlPullParser.START_TAG
判斷是否是標籤結束:XmlPullParser.END_TAG 
判斷是否是文件結尾:XmlPullParser.END_DOCUMENT

     (5)將指針往下推

parser.next();

    (6)解析結束

 

三. Pull解析Demo

(一)仍然以前面兩篇文章介紹的工程來實現Pull對XML文件的解析。

<?xml version="1.0"  encoding="UTF-8"?>
<persons>
    <person id="0">
        <name>劉德華</name>
        <sex>男</sex>
        <age>21</age>
    </person>
    <person id="1">
        <name>張漫玉</name>
        <sex>女</sex>
        <age>22</age>
    </person>
    <person id="2">
        <name>張易謀</name>
        <sex>男</sex>
        <age>23</age>
    </person>
    <person id="3">
        <name>周新馳</name>
        <sex>未知</sex>
        <age>24</age>
    </person>
    <person id="4">
        <name>納蘭容若</name>
        <sex>男</sex>
        <age>25</age>
    </person>
</persons>

 

 

(二)工程源碼框架

 

(2)PullParseService.java  (核心代碼)

package com.laolu.parser;

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

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

public class PullParserService 
{
	List<Map<String,Object>> persons=null;
	Map<String,Object> person=null;

	public PullParserService() {}
	public List<Map<String,Object>> getPersons(InputStream inputStream) throws Exception
	{
		XmlPullParser pullParser=Xml.newPullParser();
		pullParser.setInput(inputStream, "UTF-8");
		int eventType=pullParser.getEventType();//觸發第一個事件
		while(eventType!=XmlPullParser.END_DOCUMENT)
		{
			switch(eventType)
			{
			case XmlPullParser.START_DOCUMENT:
				persons=new ArrayList<Map<String,Object>>(); 
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(pullParser.getName().trim()))
				{
					person=new HashMap<String,Object>();
					String id=pullParser.getAttributeValue(0);
					person.put("id", id);
				}
				if(person!=null)
				{
					if("name".equals(pullParser.getName().trim()))
					{
						String name=pullParser.nextText();
						person.put("name", name);
					}else if("sex".equals(pullParser.getName().trim()))
					{
						String sex=pullParser.nextText();
						person.put("sex", sex);
					}else if("age".equals(pullParser.getName().trim()))
					{
						String age=pullParser.nextText();
						person.put("age", age);
					}
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(pullParser.getName().trim()))
				{
					persons.add(person);
					person=null;
				}
				break;
			}
			eventType=pullParser.next();
		}
		return persons;
	}
	
}


 

 

 

 

 

  

發佈了60 篇原創文章 · 獲贊 173 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章