Android开发系列(八):采用Pull解析器解析和生成XML内容

因为有些时候,应用的数据是采用XML文件的格式存放的,所以我们需要知道怎么从XML文件中读取这些数据

在Android中可以通过SAX、DOM、pull解析XML文件。

在本篇博文中主要介绍采用Pull解析器解析和生成XML内容。

介绍:在Android已经集成了Pull解析器,所以无需添加任何的jar文件。在Android中本身用到的各种xml文件,其内部也是采用Pull解析器进行解析的。

一、采用Pull解析器解析XML文件内容

首先,我们需要先建立一个Android Project项目,名称为:xml。默认生成MainActivity.java,在cn.itcast.xml包下,这个java文件里边的内容是自动生成的。

然后,我们在src目录下建立一个xml文件:person.xml:

<?xml version="1.0" encoding="UTF-8"?> <!-- 这个文件头是start document事件 -->
<persons>
	<person id="1">
		<name>zhangsan</name>
		<age>30</age>
	</person>
	<person id="2">
		<name>lisi</name>
		<age>25</age>
	</person>
</persons>

可以看出来这个xml文件存了两个person的信息。

接下来,我们需要建立一个javabean来反射这个xml文件,Person.java(注意这个bean中的属性要和xml中的对应,不然不能正确解析):

package cn.itcast.domain;

public class Person {
	private Integer id;
	private String name;
	private Integer age;

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}

}

在这个java文件中我们定义了三个属性:id、name、age,并生成了一个toString()的方法

在实体类建好之后,我们需要写业务层的类了,PersonService.java:

package cn.itcast.service;

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

import cn.itcast.domain.*;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Xml;

public class PersonService {

	public static List<Person> getPersons(InputStream xml) throws Exception{
		List<Person> persons = null;
		Person person  = null;
		//得到解析器
		/*这个方法和下边功能相同,可以得到解析器:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();*/
		XmlPullParser pullParser = Xml.newPullParser();

		pullParser.setInput(xml,"UTF-8");//为Pull解析器设置要解析的XML数据
		int event = pullParser.getEventType(); //产生第一个事件:start document
		while(event != XmlPullParser.END_DOCUMENT){
			switch (event) { //对事件进行判断
			case XmlPullParser.START_DOCUMENT:
				persons = new ArrayList<Person>();
				break;
			case XmlPullParser.START_TAG:
				if("person".equals(pullParser.getName())){
					int id = new Integer(pullParser.getAttributeValue(0));
					person = new Person();
					person.setId(id);
				}
				if("name".equals(pullParser.getName())){
					String name = pullParser.nextText();
					person.setName(name);
				}
				if("age".equals(pullParser.getName())){
					int age = new Integer(pullParser.nextText());
					person.setAge(age);
				}
				break;
			case XmlPullParser.END_TAG:
				if("person".equals(pullParser.getName())){
					persons.add(person);
					person = null;
				}
				break;
			}
			event = pullParser.next();
		}
		return persons;
	}
}

这段代码比较麻烦,我们接下来具体分析一下:

XmlPullParser pullParser = Xml.newPullParser();这段代码是为了得到一个Pull解析器,另外:XmlPullParser pullParser = XmlPullParserFactory.newInstance().newPullParser();也可以得到Pull解析器。

pullParser.setInput(xml,"UTF-8");用来设置要解析的xml文件的编码格式,这里是“UTF-8”

因为Pull解析器是一个遍历文档的过程,所以要从<?xml version="1.0" encoding="UTF-8"?>这个start document事件开始,一直到</persons>结束。

int event = pullParser.getEventType();在这个时候,文档被初始化,这里会获得文档的start document,就是START_DOCUMENT事件。

然后,是一个while循环,限制条件是event != XmlPullParser.END_DOCUMENT,即当前遍历的节点没有达到结尾,就会执行while循环。

在while循环里边是一个switch()控制语句,用来控制当前选中的是哪个节点,里边有三个case:

case XmlPullParser.START_DOCUMENT:满足START_DOCUMENT事件(就是xml文件的开头)

case XmlPullParser.START_TAG:满足START_TAG事件(就是xml元素节点的开头:比如本篇中的<person>)

case XmlPullParser.END_TAG::满足END_TAG事件(就是xml元素节点的结尾:比如本篇中的</person>)

在第二个case中,我们做了三个判断:

if("person".equals(pullParser.getName())):如果到达的是person元素节点,则把id赋给person

if("name".equals(pullParser.getName())):如果到达的是name元素节点,则把name赋给person

if("age".equals(pullParser.getName())):如果到达的是age元素节点,则把age赋给person

注意,在每一次switch()控制语句结束之后,会有一个event = pullParser.next(),这句话的意思是把Pull解析器指针指向下个节点。

以上,我们就把Pull解析器完成了,然后我们编写一个测试类:

注意首先配置AndroidManfiest.xml引入测试的语法,这里不多说了。

编写PersonServiceTest.java,放在cn.itcast.test文件目录下:

package cn.itcast.test;

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

import cn.itcast.domain.Person;
import cn.itcast.service.PersonService;
import android.test.AndroidTestCase;
import android.util.Log;

public class PersonServiceTest  extends AndroidTestCase{
	private static final String TAG = "PersonServiceTest";
	public void testPersons() throws Exception{
		//通过getClassLoader()方法得到src目录下person.xml文件的输入流
		InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
		List<Person> persons = PersonService.getPersons(xml);
		for(Person person : persons){
			Log.i(TAG, person.toString());
		}
	}
}

然后,我们在LogCat页面中添加一个过滤器:

就可以在LogCat页面打印出来persons了。

二、采用Pull解析器生成XML内容

时间: 2024-10-04 17:07:05

Android开发系列(八):采用Pull解析器解析和生成XML内容的相关文章

Android开发系列之XML解析

 xml文件存储是常用的数据存储方式,xml解析常用的有SAX解析.DOM解析.PULL解析等.本篇讲述xml的格式,xml的写入方式以及xml的解析.   .xml格式 <cartons> <carton id="1"> <name>天空之城</name> <maker>宫崎骏</maker> <style>冒险</style> <date>1986年8月2日</date

快速Android开发系列网络篇之Volley

Volley是Google推出的一个网络请求库,已经被放到了Android源码中,地址在这里,先看使用方法 RequestQueue mRequestQueue = Volley.newRequestQueue(context); JsonObjectRequest req = new JsonObjectRequest(URL, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONO

通过pull解析器操作安卓的xml

通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: ============================================================================================== 使用pull解析器解析person.xml文件 public class PersonService {  public static List g

S5PV210开发系列八_Yaffs的移植

S5PV210开发系列八 Yaffs的移植 象棋小子    1048272975 Nand作为市面上最基本的非易失性闪存技术之中的一个,应用在各种固态大容量存储解决方式中.因为Nand flash自身的特点,Nand存储器往往须要一款专用的Nand文件系统进行管理.开源的Yaffs文件系统因为其优异的性能,在Nand flash中受到广泛的应用,笔者此处就Yaffs的移植作一个简单的介绍. 1. Yaffs概述 Yaffs是由Aleph One公司所发展出来的Nand flash文件系统,专门为

快速Android开发系列网络篇之Android-Async-Http

快速Android开发系列网络篇之Android-Async-Http 转:http://www.cnblogs.com/angeldevil/p/3729808.html 先来看一下最基本的用法 AsyncHttpClient client = new AsyncHttpClient(); client.get("http://www.google.com", new AsyncHttpResponseHandler() { @Override public void onSucce

快速Android开发系列网络篇之Retrofit

Retrofit是一个不错的网络请求库,用官方自己的介绍就是: A type-safe REST client for Android and Java 看官网的介绍用起来很省事,不过如果不了解它是怎么实现的也不太敢用,不然出问题了就不知道怎么办了.这几天比较闲就下下来看了一下,了解一下大概实现方法,细节就不追究了.先来看一个官网的例子,详细说明去网官看 简单示例 首先定义请求接口,即程序中都需要什么请求操作 public interface GitHubService { @GET("/use

C#程序员学习Android开发系列之搭建开发环境

接触Android好久了,记得09年刚在中国大陆有点苗头的时候,我就知道了google有个Android,它是智能机操作系统.后来在Android出1.5版本之后,我第一时间下载了eclipse开发工具.adt以及android sdk,体验了一把android开发,记得当时搭建开发环境相当麻烦.由于android开发是基于Java的,所以除了上述的工具之外,首先需要安装jdk,记得当时流行的是jdk1.5(后来是1.6,现在是1.7,未来是1.8),安装好之后需要设置环境变量. 时隔4年之后,

Android开发系列(五):Android应用中文件的保存与读取

在本篇博客中,我们要实现在Android中"新建文件"和"读取文件": 目标界面: 在输入文件名称之后,输入文件内容,点击保存,可以保存成为一个文档 首先,我们先建立一个Android Project项目,项目名称:File. 然后,我们需要先实现目标视图中的界面: 编辑strings.xml文件: <?xml version="1.0" encoding="utf-8"?> <resources> &

C#程序员学习Android开发系列之按钮事件的4种写法

经过前两篇blog的铺垫,我们今天热身一下,做个简单的例子. 目录结构还是引用上篇blog的截图. 具体实现代码: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 方法1.