您的位置:首页 > 移动开发 > Android开发

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

2013-01-22 10:30 465 查看
笔记摘要:

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

一、Pull解析器方式的介绍

除了可以使用SAX或DOM解析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文件
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: