首页 > 代码库 > 赵雅智_pull解析xml

赵雅智_pull解析xml

Pull 解析器简介

Pull 解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如: 开始元素和结束元素事件,使用xmlPullParser.next() 可以进入下一个元素并触发相应事件。跟 SAX 不同的 是, Pull 解析器产生的事件是一个数字,而非方法,因此可以使用一个 switch 对事件进行处理。当元素开始解析时,调用 parser.nextText() 方法可以获取下一个 Text 类型节点的值。

Pull解析器的源码及文档下载网址:http://www.xmlpull.org/

解析步骤

1.直接创建出XmlPullParser解析对象
2.设置解析文件输入流并且指定输入流在操作的编码方式
3.获取解析文件时返回的eventType时间类型
4.while循环遍历到文档结尾
5.使用xmlPullParser.next()进入下一个元素并触发
6.switch语句循环遍历结果 
7.在标签结束时,进行添加到集合中
8.释放资源
Xml.newPullParser()--->setInput-->getEventType()--->while(type!=XmlPullParser.END_DOCUMENT)-->case type  --> parser.getName()去判断---->获得的信息添加进对象--->type = parser.next();指针下移

实例代码:

资源文件china.xml

<?xml version="1.0" encoding="UTF-8"?>
<china dn="day"><city
        cityname="江苏"  
        pyName="jiangsu"
        quName="江苏"
        state1="1"
        state2="1"
        stateDetailed="多云"
        tem1="24"
        tem2="19"
        windState="西北风3-4级" />

 <city
        cityname="北京"  
        pyName="beijing"
        quName="北京"
        state1="1"
        state2="1"
        stateDetailed="多云"
        tem1="30"
        tem2="19"
        windState="西北风5-6级" />
<city>
          <cityname>河南</cityname>
          <pyName>henan</pyName>
          <quName>河南</quName>
          <state1>1</state1>
          <state2>1</state2>
          <stateDetailed>多云转晴</stateDetailed>
          <tem1>38</tem1>
          <tem2>-1</tem2>
          <windState>东南风2-3级</windState>
          
</city>
  
</china>

实体类City.java

package com.example.domain;

public class City {
	private String cityname;
	private String pyName;
	private String quName;
	private String state1;
	private String state2;

	@Override
	public String toString() {
		return "City [cityname=" + cityname + ", pyName=" + pyName
				+ ", quName=" + quName + ", state1=" + state1 + ", state2="
				+ state2 + ", stateDetailed=" + stateDetailed + ", tem1="
				+ tem1 + ", tem2=" + tem2 + ", windState=" + windState + "]";
	}

	private String stateDetailed;
	private String tem1;
	private String tem2;
	private String windState;

	public String getCityname() {
		return cityname;
	}

	public City() {
		super();
	}

	public void setCityname(String cityname) {
		this.cityname = cityname;
	}

	public String getPyName() {
		return pyName;
	}

	public void setPyName(String pyName) {
		this.pyName = pyName;
	}

	public String getQuName() {
		return quName;
	}

	public void setQuName(String quName) {
		this.quName = quName;
	}

	public String getState1() {
		return state1;
	}

	public void setState1(String state1) {
		this.state1 = state1;
	}

	public String getState2() {
		return state2;
	}

	public void setState2(String state2) {
		this.state2 = state2;
	}

	public String getStateDetailed() {
		return stateDetailed;
	}

	public void setStateDetailed(String stateDetailed) {
		this.stateDetailed = stateDetailed;
	}

	public String getTem1() {
		return tem1;
	}

	public void setTem1(String tem1) {
		this.tem1 = tem1;
	}

	public String getTem2() {
		return tem2;
	}

	public void setTem2(String tem2) {
		this.tem2 = tem2;
	}

	public String getWindState() {
		return windState;
	}

	public void setWindState(String windState) {
		this.windState = windState;
	}

	public City(String cityname, String pyName, String quName, String state1,
			String state2, String stateDetailed, String tem1, String tem2,
			String windState) {
		super();
		this.cityname = cityname;
		this.pyName = pyName;
		this.quName = quName;
		this.state1 = state1;
		this.state2 = state2;
		this.stateDetailed = stateDetailed;
		this.tem1 = tem1;
		this.tem2 = tem2;
		this.windState = windState;
	}

}

解析工具类PullXml.java

package com.example.util;

import java.util.ArrayList;
import java.util.List;

import org.xmlpull.v1.XmlPullParser;

import android.util.Xml;

import com.example.domain.City;

public class PullXml {
	public List<City> pullXml() {
		List<City> entities = null;
		City currentCity = null;
		// 1.直接创建出XmlPullParser解析对象
		XmlPullParser xmlPullParser = Xml.newPullParser();
		try {
			// 2.设置解析文件输入流并且指定输入流在操作的编码方式
			xmlPullParser.setInput(getClass().getClassLoader()
					.getResourceAsStream("china.xml"), "UTF-8");

			// 3.获取解析文件时返回的eventType时间类型
			int eventType = xmlPullParser.getEventType();

			// while循环遍历到文档结尾
			while (eventType != XmlPullParser.END_DOCUMENT) {
				switch (eventType) {
				case XmlPullParser.START_DOCUMENT:
					entities = new ArrayList<City>();
					break;
				case XmlPullParser.END_DOCUMENT:

					break;
				case XmlPullParser.START_TAG:

					String name = xmlPullParser.getName();
					if (name.equals("city")) {
						// 声明当前的city对象
						currentCity = new City();
						int count = xmlPullParser.getAttributeCount();
						if (count > 0) {
							/*
							 * cityname="北京" pyName="beijing" quName="北京"
							 * state1="1" state2="1" stateDetailed="多云"
							 * tem1="30" tem2="19" windState="西北风5-6级"
							 */
							currentCity.setCityname(xmlPullParser
									.getAttributeValue(null, "cityname"));
							currentCity.setPyName(xmlPullParser
									.getAttributeValue(null, "pyname"));
							currentCity.setQuName(xmlPullParser
									.getAttributeValue(null, "quname"));
							currentCity.setState1(xmlPullParser
									.getAttributeValue(null, "state1"));
							currentCity.setState2(xmlPullParser
									.getAttributeValue(null, "state2"));
							currentCity.setStateDetailed(xmlPullParser
									.getAttributeValue(null, "stateDetailed"));
							currentCity.setTem1(xmlPullParser
									.getAttributeValue(null, "tem1"));
							currentCity.setTem2(xmlPullParser
									.getAttributeValue(null, "tem2"));
							currentCity.setWindState(xmlPullParser
									.getAttributeValue(null, "windState"));
						}

					} else if (currentCity != null) {
						/*
						 * <cityname>河南</cityname> <pyName>henan</pyName>
						 * <quName>河南</quName> <state1>1</state1>
						 * <state2>1</state2>
						 * <stateDetailed>多云转晴</stateDetailed> <tem1>38</tem1>
						 * <tem2>-1</tem2> <windState>东南风2-3级</windState>
						 */
						if (name.equalsIgnoreCase("cityname")) {
							currentCity.setCityname(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("pyName")) {
							currentCity.setPyName(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("quName")) {
							currentCity.setQuName(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("state1")) {
							currentCity.setState1(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("state2")) {
							currentCity.setState2(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("stateDetailed")) {
							currentCity.setStateDetailed(xmlPullParser
									.nextText());
						} else if (name.equalsIgnoreCase("tem1")) {
							currentCity.setTem1(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("tem2")) {
							currentCity.setTem2(xmlPullParser.nextText());
						} else if (name.equalsIgnoreCase("windState")) {
							currentCity.setWindState(xmlPullParser.nextText());
						}

					}
					break;
				case XmlPullParser.END_TAG:

					String names = xmlPullParser.getName();
					// 在标签结束时,进行添加到集合中
					if (xmlPullParser.getName().equalsIgnoreCase("city")
							&& currentCity != null) {
						// 添加到集合中
						entities.add(currentCity);
						//释放资源
						currentCity = null;
					}
					break;

				default:
					break;
				}

				// 使用xmlPullParser.next()进入下一个元素并触发
				eventType = xmlPullParser.next();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return entities;
	}
}

运行结果

用上篇讲解的测试方法测试程序结果 :