笔记摘要:
这里介绍了一种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 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文件
}
}