除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull解析器的源码及文档下载网址:http://www.xmlpull.org/
步骤
添加文件 PullPersonService
public class PullPersonService {
public static List<Person> getPersonList(InputStream inStream)
throws Exception {
List<Person> personList = null;
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "utf-8");
int eventType = parser.getEventType();
Person person = null;
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
personList = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
// 判断当前元素名是否为person
if ("person".equals(parser.getName())) {
person = new Person();
person.setId(Integer.valueOf(parser.getAttributeValue(0)));
} else if ("name".equals(parser.getName())) {
person.setName(parser.nextText());
} else if ("age".equals(parser.getName())) {
person.setAge(Integer.valueOf(parser.nextText()));
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName()) && person != null) {
personList.add(person);
person = null;
}
break;
}
// next方法的调用导致下一个节点的解析,同时返回下一个节点解析的事件类型代码
eventType = parser.next();
}
return personList;
}
public void testPull() throws Throwable {
InputStream inStream = this.getClass().getClassLoader()
.getResourceAsStream("person_list.xml");
List<Person> personList = PullPersonService.getPersonList(inStream);
Log.i("TAG", personList.toString());
}
Pull实现xml文件的生成
有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中;或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器。
使用Pull解析器生成一个与itcast.xml文件内容相同的myitcast.xml文件,代码在本页下方备注
使用代码如下(生成XML文件):
File xmlFile = new File("person.xml");
FileOutputStream outStream = new FileOutputStream(xmlFile);
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter writer = new BufferedWriter(outStreamWriter);
writeXML(persons, writer);
writer.flush();
writer.close();
如果只想得到生成的xml字符串内容,可以使用StringWriter:
StringWriter writer = new StringWriter();
writeXML(persons, writer);
String content = writer.toString();
实例介绍:
1、在PullPersonService中添加静态方法
public static void writePersonList(List<Person> personList, Writer writer)
throws Exception {
XmlSerializer serializer = Xml.newSerializer();
serializer.setOutput(writer);
// 相当于写入<?xml version="1.0" encoding="UTF-8"?>
serializer.startDocument("utf-8", true);
//写入跟元素的起始标签
serializer.startTag(null, "persons");
//遍历personList,并且将集合中的Person对象作为person节点写入xml
for(Person person: personList){
serializer.startTag(null, "person");
//为person元素添加id属性
serializer.attribute(null, "id", String.valueOf(person.getId()));
serializer.startTag(null, "name");
serializer.text(person.getName());
serializer.endTag(null, "name");
serializer.startTag(null, "age");
serializer.text(String.valueOf(person.getAge()));
serializer.endTag(null, "age");
serializer.endTag(null, "person");
}
//写入跟元素的结束标签
serializer.endTag(null, "persons");
//结束文档的写入
serializer.endDocument();
writer.flush();
writer.close();
}
添加测试方法
public void testPullSave() throws Throwable{
List<Person> personList = new ArrayList<Person>();
personList.add(new Person(999,"Tom", 20));
personList.add(new Person(888,"Mary", 21));
personList.add(new Person(777,"Jack", 10));
File file = new File(this.getContext().getFilesDir(), "new_persons.xml");
Writer writer = new FileWriter(file);
PullPersonService.writePersonList(personList, writer);
}
}
3、执行android单元测试
在视图中打开FileExplorer,在如下路径中找到生成的文件
data -> data -> cn.class3g.activity-> file – new_person.xml
文件浏览器界面图: