利用Pull解析器解析XML文档
概述:
PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。
PULL 的工作原理:
XML pull提供了开始元素和结束元素。当某个元素开始时,可以调用parser.nextText从XML文档中提取所有字符数据。当解析到一个文档结束时,自动生成EndDocument事件。
解析xml文件信息:
javabean
public class Person {
private Integer id;
private Integer age;
private String name;
public Person() {}
public Person(Integer id, Integer age, String name) {
super();
this.id = id;
this.age = age;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer 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 + "]";
}
}
Xml文档
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person id="23">
<name>liming</name>
<age>30</age>
</person>
<person id="20">
<name>gp</name>
<age>12</age>
</person>
</persons>
//解析xml文档的代码
public static List<Person> getPersons(InputStream xml) throws Exception{
XmlPullParser pullparse = Xml.newPullParser(); //生成xml解析器
List<Person> persons = null;
Person person = null;
pullparse.setInput(xml, "UTF-8");
int event = pullparse.getEventType(); //pull解析器通过事件触发,start document事件需要通过这个方法获得
while(event != XmlPullParser.END_DOCUMENT){
switch (event) {
case XmlPullParser.START_DOCUMENT: //判断是否文档标签
persons = new ArrayList<Person>(); //初始化集合装载xml中的内容
break;
case XmlPullParser.START_TAG: //判断是否是元素标签开始
if("person".equals(pullparse.getName())){ //匹配相应的元素标签名称
person = new Person();
person.setId(new Integer(pullparse.getAttributeValue(0))); //得到节点的第一个属性并装载
}
if("name".equals(pullparse.getName())){
person.setName(pullparse.nextText());
}
if("age".equals(pullparse.getName())){
person.setAge(new Integer(pullparse.nextText()));
}
break;
case XmlPullParser.END_TAG: //判断是否是元素标签结束
if("person".equals(pullparse.getName())){ //匹配
persons.add(person);
person = null;
}
break;
}
event = pullparse.next(); //指针下移
}
return persons;
}
测试文件:
private final static String TAG = "read_xml";
public void read_xml() throws Exception{
//从类路径的根目录文件寻找.....文件并以输入流方式装载给解析类
List<Person> persons = personService.getPersons(this.getClass().getClassLoader().getResourceAsStream("person.xml"));
for(Person person : persons){
Log.i(TAG, person.toString());
}
}
保存xml文件信息:
保存xml文件:
public static void save (List<Person> persons ,OutputStream out) throws Exception, IllegalStateException, IOException{
XmlSerializer serializer = Xml.newSerializer(); //得到xml序列化器
serializer.setOutput(out, "UTF-8"); //设置内容的输出方向
serializer.startDocument("UTF-8", true); //输出开始文档
serializer.startTag(null, "persons"); //生成persons节点 没有命名空间第一个参数为null
for(Person p : persons){ //迭代集合
serializer.startTag(null, "person");
serializer.attribute(null, "id" , p.getId().toString()); //设置元素属性
serializer.startTag(null, "name");
serializer.text(p.getName().toString()); //设置文本节点内容
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(p.getAge().toString());
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
serializer.endTag(null, "persons");
serializer.endDocument(); //结束文档
out.flush(); //刷出数据避免是缓存输入流
out.close();
}
public void save () throws Exception{
List<Person> persons = new ArrayList<Person>();
persons.add(new Person(12,55,"czy"));
persons.add(new Person(13,44,"gp"));
persons.add(new Person(14,33,"zzy"));
File file = new File(getContext().getFilesDir(),"save.xml");
FileOutputStream out = new FileOutputStream(file);
personService.save(persons,out); //以文件输出流方式保存到当前应用包下的files文件夹里面
}