除了可以使用 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()); }
有些时候,我们需要生成一个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
文件浏览器界面图: