Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是,Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
1.工程目录结构
person.xml
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>leehom</name>
<age>38</age>
</person>
<person id="20">
<name>leoleo</name>
<age>22</age>
</person>
</persons>
2.1 person.java
package com.example.domain;
public class Person {
private Integer id;
private String name;
private Integer 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;
}
@Override
public String toString() {
return "Person [id=" + id + ",name=" + name + ",age=" + age + "]";
}
public Person(Integer id,String name,Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
}
2.2 PersonService.java
package com.example.service;
import java.io.IOException;
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 com.example.domain.Person;
public class PersonService {
/** * 获取数据 * * @param xml * @return * @throws Exception */
public static List<Person> getPersons(InputStream xml) throws Exception {
List<Person> persons = null;
Person person = null;
XmlPullParser pullParser = Xml.newPullParser();
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())) {
int id = new Integer(pullParser.getAttributeValue(0));
person = new Person();
person.setId(id);
} else if ("name".equals(pullParser.getName())) {
String name = pullParser.nextText();
person.setName(name);
} else 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;
}
/** * 保存数据 * * @param persons * @param outStream * @throws Exception */
public static void save(List<Person> persons,OutputStream outStream)
throws Exception {
XmlSerializer serializer = Xml.newSerializer(); // 创建xml的序列化文件
serializer.setOutput(outStream,"UTF-8"); // 传入保存的输出流,和字符集编码
serializer.startDocument("UTF-8",true); // xml头标签字符集设置,是否序列化
serializer.startTag(null,"persons"); // 开始节点设置,(命名空间null,名称persons)
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(); // 结束xml编辑,即设置xml文档结尾
outStream.flush(); // 最好先将缓存中数据刷出再关闭输出流以防传入的流是缓存流
outStream.close();
}
}
2.3 PersonServiceTest.java
package com.example.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 com.example.domain.Person;
import com.example.service.PersonService;
public class PersonServiceTest extends AndroidTestCase {
private static final String TAG="PersonServiceTest";
public void testPersons() throws Exception{
InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");
List<Person> persons = PersonService.getPersons(xml);
for(Person person :persons){
Log.i(TAG,person.toString());
}
}
public void testSave() throws Exception{
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(1,"leo1",21));
persons.add(new Person(2,"leo2",22));
persons.add(new Person(3,"leo3",23));
//包 /files
File xmlFile = new File(getContext().getFilesDir(),"leoleohan.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
PersonService.save(persons,outStream);
}
}