1、使用XmlPullParser解析xml数据:
①pullParser.setInput(xml,"UTF-8");给pull解析器一个输入流数据。
②int eventType = pullParser.getEventType();获取当前事件类型。
③while (eventType != XmlPullParser.END_DOCUMENT) 比对当前事件类型是否为xml文档中的"END_DOCUMENT",若“是”则结束解析。
eventType = pullParser.next();顺移当前解析器的指针。
④case XmlPullParser.START_TAG:当解析遇到元素的开始标识时,判断具体是哪个元素,获取所需的数据。
⑤case XmlPullParser.END_TAG:当解析遇到元素的结束标识时,判断是否为一个完整数据的结束标识,若“是”则打包一条数据。
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"); int eventType = pullParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_DOCUMENT: persons = new ArrayList<Person>(); break; case XmlPullParser.START_TAG: if ("person".equals(pullParser.getName())) { int id = Integer.parseInt(pullParser.getAttributeValue(0)); person = new Person(); person.setId(id); } if ("name".equals(pullParser.getName())) { String name = pullParser.nextText(); person.setName(name); } if ("age".equals(pullParser.getName())) { int age = Integer.parseInt(pullParser.nextText()); person.setAge(age); } break; case XmlPullParser.END_TAG: if ("person".equals(pullParser.getName())) { persons.add(person); person = null; } break; } eventType = pullParser.next(); } return persons; }2、XmlSerializer序列化生成xml数据:
①serializer.setOutput(outStream,"UTF-8");给序列化器一个输出流。
②根据所需xml数据格式开始序列化生成xml数据。
public static void createXml(List<Person> persons,OutputStream outStream) throws Exception { XmlSerializer serializer = Xml.newSerializer(); serializer.setOutput(outStream,"UTF-8"); serializer.startDocument("UTF-8",true); serializer.startTag(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(); outStream.flush(); outStream.close(); }
bug: 实现
Xml.newPullParser()
调用
nextText()有个错误,nextText()
并不总是向文档中所提到优先于
END_TAG执行
。