Android学习--使用Pull解析器读取XML文件、将对象写入XML文件

笔记摘要:

这里介绍了一种XML文件的另一种解析方式,在Android中已经集成,应用比较广泛,同时我们可以使用Pull解析器对对象进行序列化,写入到Xml文件中。


一、Pull解析器方式的介绍

    除了可以使用SAXDOM解析XML文件之外,还可以使用Android内置的Pull解析器解析XML文件。Pull解析器是一个开源的java项目,既可以用于Android

  也可以用于JavaEE。如果用在javaEE中,需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。Android系统本身使

  用到的各种xml文件,其内部也是采用Pull解析器进行解析的。Pull解析器的运行方式与SAX解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,

  使用parser.next()可以进入系一个元素并触发相应事件。跟SAX不同的是Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件

  进行处理,当元素开始解析时,调用parser.nextText()方法获取下一个Text类型节点的值。


二、代码演示

  通过测试的方式对使用Pull解析器解析XML文档,并将集合中的对象写入到XML文档中进行演示,废话不多说,直接上代码


在AndroidMainfest.xml中配置测试环境

<uses-library android:name="android.test.runner"></uses-library>

<instrumentation android:targetPackage="cn.xushuai.pullparser" 
	    android:name="android.test.InstrumentationTestRunner" ></instrumentation>


提供一个XML文件用于解析:

<?xml version="1.0" encoding="UTF-8"?>

<persons>
	<person id = "001">
		<name>zhangsan</name>
		<age>22</age>
	</person>
	
	<person id = "002">
		<name>lisi</name>
		<age>23</age>
	</person>
</persons>



有了对象当然需要一个JavaBean

package cn.xushuai.domain;

public class Person {
	private String id;
	private Integer age;
	private String name;
	
	public Person(String id, String name,Integer age ) {
		super();
		this.id = id;
		this.age = age;
		this.name = name;
	}
	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", age=" + age + ", name=" + name + "]";
	}
}

业务类:

     1、解析XML文档

     2、将集合中的对象写入到本地的XML文档

package cn.xushuai.service;

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

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlSerializer;

import android.util.Xml;
import cn.xushuai.domain.Person;

//读取XML文档
public class PersonService {

	/*获取数据
	 * @param xml
	 * @return 
	 * @throws Exception
	 * */
	public static List<Person> getPersons(InputStream xml)throws Exception{
		List<Person> persons = null;
		Person person = null;
		
		//获取Pull解析器的两种方式
		//XmlPullParser pullParser =  XmlPullParserFactory.newInstance().newPullParser();
		XmlPullParser pullParser = Xml.newPullParser();	//使用Android提供的帮助类直接获取
		
		pullParser.setInput(xml,"UTF-8");		//为pull解析器设置要解析的XML数据和编码		
		int event = pullParser.getEventType();	//获取触发事件类型
		
		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())){
				String id = pullParser.getAttributeValue(0);
				person = new Person(null,null,null);	//对象实例化
				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());
				int age = Integer.valueOf(pullParser.nextText());
				person.setAge(age);
			}
			break;
			
		case XmlPullParser.END_TAG://触发结束标签事件
			if("person".equals(pullParser.getName())){	//如果节点为person,将对象添加到集合中
				persons.add(person);
				person = null;		
			}
			break;
		}
		event = pullParser.next();	//使得解析器进行下一个节点,并触发事件,不调用则不会继续解析
		}
		return persons;//返回解析后的对象集合
	}
	
	/*保存数据
	 * @param persons 数据
	 * @param out 输出方向
	 * @throws Exception
	 * */
	public static void save(List<Person> persons,OutputStream out)throws Exception{
		XmlSerializer serializer = Xml.newSerializer();	//获取一个序列化器
		serializer.setOutput(out,"UTF-8");	//设置输出流
		
		serializer.startDocument("UTF-8", true);	//文件开始标志设置,true代表文件可独立存在
		
		//生成文档正文部分
		serializer.startTag(null, "persons");	//设置开始元素节点,null:没有指定命名空间
		for(Person person : persons){
			serializer.startTag(null, "person");
			serializer.attribute(null,"id",person.getId().toString());	//设置属性
			
			serializer.startTag(null, "name");
			serializer.text(person.getName());	//设置文本内容
			serializer.endTag(null,"name");
			
			serializer.startTag(null, "age");
			serializer.text(person.getAge().toString());
			serializer.endTag(null,"age");
		
			serializer.endTag(null, "person");	
		}
		serializer.endTag(null, "persons");		//设置结束元素节点
		serializer.endDocument();	//文件结束标志设置
		
		out.flush();	//将数据刷出去,避免用户传入缓冲流导致效率慢
		out.close();
	}
	
}



测试类

package cn.xushuai.test;

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

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

public class PersonServiceTest extends AndroidTestCase{
	
	public static final String TAG = "PersonServiceTest";//定义一个标签,将对象以日志的信息输出
	public void testPerson()throws Exception{
		
		InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");//通过类加载器加载本地文件
		List<Person> persons = PersonService.getPersons(xml);//将XML中的数据封装成对象
		for(Person person : persons){
			Log.i(TAG,person.toString());	//通过日志形式输出
		}
	}
	public void testSave()throws Exception{
		
		List<Person> persons = new ArrayList<Person>();//创建一个集合用于存储对象,用于写入XML文件中
		persons.add(new Person("005","hhaha",19));
		persons.add(new Person("006","sa",39));
		persons.add(new Person("007","lina",25));
		
		//将数据保存到当前应用所在包的files文件夹中
		File xmlFile = new File(getContext().getFilesDir(),"pullparser.xml");
		FileOutputStream fos = new FileOutputStream(xmlFile);
		
		PersonService.save(persons,fos);//将对象保存到XML文件
	}
}


posted @ 2013-01-22 10:30  积小流,成江海  阅读(757)  评论(0编辑  收藏  举报