赵雅智_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;
	}
}

运行结果

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

赵雅智_pull解析xml

时间: 2024-10-20 07:29:18

赵雅智_pull解析xml的相关文章

赵雅智_AndroidManifest.xml配置文件详解

HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13235    Accepted Submission(s): 3096 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候

赵雅智:android教学大纲

带下划线为具体内容链接地址,点击后可跳转,希望给大家尽一些微薄之力,目前还在整理中 教学章节 教学内容 学时安排 备注 1 Android快速入门 2 Android模拟器与常见命令 3 Android用户界面设计 4 Android网络通信及开源框架引用 5 线程与消息处理 6 数据存储及访问 7 Android基本单元应用activity 8 Android应用核心Intent 9 资源访问 10 ContentProvider实现数据共享 11 BroadcastReceiver 12 S

赵雅智_android实例_当监听类有数据更新时下拉刷新

之前两篇文章分别介绍了OnScrollListener的实现和ContentProvider监听数据的变化,下面我们就结合者两个知识点实现一个小项目 项目需求 使用当ContentProvider监听类有数据更新时,在当前界面进行提示,并用OnScrollListener实现下拉刷新 实现效果 通过ContentProvider显示数据在界面 当监听类发生变化时 下拉刷新后显示数据 实现步骤 android_sqlite项目 定义操作标识 匹配结果码 继承ContentProvider类重写方法

赵雅智_通过fragment对布局进行改变

项目需求 设置两个片段,昨天片段对右边进行颜色更改,片段替换的操作 实现效果 点击片段1:改变片段1的颜色值 点击片段2替换片段1 实现步骤 新建主activity并在布局添加两个片段 左片段 对片段1进行颜色值改变的点击事件 获取FragmentManager对象,只要获取FragmentManager对象就能获取fragment对象 根据FragmentManager对象的findFragmentById方法来获取指定的fragment 获取Fragment中的布局文件 获取view中任何控

赵雅智_android系统联系人app分析并获取数据

手机联系人存放位置 和短信一样在data-data下 手机联系人数据库解析 将contacts2.db表导出,通过SQLiteexpert查看 mimetypes表:存放的数据类型(电话,头像,姓名,邮箱) 外键: raw_contacts表:存放联系人的id contact_id:联系人id display_name:联系人姓名 data表:存放联系人的数据 data1:联系人数据 data2:在mimetypes表中data1表示值得意义 mimetype_id:联系人ID,data数据所属

赵雅智_Intent传值

Intent简介 Android基本的设计理念是鼓励减少组件间的耦合,因此Android提供了Intent (意图) ,Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件.使用Intent可以激活Android应用的三个核心组件:活动.服务和广播接收器. 在一个Activity中可以使用系统提供的startActivity(Intent intent)方法打开新的Activity,在打开新的Activity前,你可以决定是否为新的Ac

赵雅智_android测试

测试概念 从是否关心软件内部结构和具体实现的角度划分 黑盒测试:只关心程序执行的过程和结果 白盒测试:根据源代码写测试方法或者测试用例 灰盒测试:是介于白盒测试与黑盒测试之间的 从软件开发的过程按阶段划分有 A.单元测试 B.集成测试 C.确认测试 D.系统测试 E.验收测试 F.回归测试 G.Alpha测试 新建测试项目测试 新建测试项目 新建测试类 在本类创建测试类 新建测试类继承AndroidTestCase类 配置测试设备和类库 配置测试设备 配置类库 AndroidManifest.x

赵雅智_Activity

Activity介绍 Activity是为用户操作而展示的可视化用户界面.每个activity都与其它的保持独立.每个都是以Activity类为基类的子类实现. 一个应用程序可以只有一个activity,在实际应用中可以包含很多个.每个activity的作用,以及其数目,自然取决于应用程序及其设计.一般情况下,总有一个应用程序被标记为用户在应用程序启动的时候第一个看到的.从一个activity转向另一个的方式是靠当前的activity启动下一个. Activity显示形式 每个activity都

赵雅智_service生命周期

Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序. 服务的开发步骤 第一步:继承Service类 public class SMSService extends Service { } 第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行配置: <service android:name=".SMSService" />