Android中解析xml是非常常用的操作,除了SAX和DOM两种最常用的解析xml外,Android内置的Pull解析器解析XML文件。 在Android的源码中大量的使用Pull解析,pull不仅更加的面相对象,而且使用速度和效率更高

Pull解析器是一个开源的java项目,既可以用于android,也可以用于JavaEE。如果用在javaEE需要把其jar文件放入类路径中,因为Android已经集成进了Pull解析器,所以无需添加任何jar文件。android系统本身使用到的各种xml文件,其内部也是采用Pull解析器进行解析的。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。跟SAX不同的是, Pull解析器产生的事件是一个数字,而非方法,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。

下面代码演示如何使用Pull解析器:

如有一个person.xml

<?xml version="1.0" encoding="UTF-8"?><persons><person id="23"><name>liming</name><age>30</age></person><person id="20"><name>zhangxiaoxiao</name><age>25</age></person></persons>

Person实体:

package com.andy.domain;public class Person {private Integer id;private String name;private Integer age;public Person() {}public Person(Integer id, String name, Integer age) {super();this.id = id;this.name = name;this.age = 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;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}

完成读写person.xml的PersonService类

package com.andy.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.XmlPullParserException;import org.xmlpull.v1.XmlSerializer;import android.util.Xml;import com.andy.domain.Person;public class PersonService {public static List<Person> getPersons(InputStream xml)throws XmlPullParserException, IOException {List<Person> persons = null;Person person = null;// XmlPullParser pullParser =// XmlPullParserFactory.newInstance().newPullParser();XmlPullParser pullParser = Xml.newPullParser();pullParser.setInput(xml, "UTF-8"); // 为xml设置要解析的xml数据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.valueOf(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.valueOf(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;}public static void savePerson(List<Person> persons,OutputStream outputStream) throws IllegalArgumentException,IllegalStateException, IOException {XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(outputStream, "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();outputStream.flush();outputStream.close();}}


更多相关文章

  1. Android的Activity屏幕切换动画||GestureDetector、OnGestureLis
  2. android:layout_gravity 和 android:gravity 的区别
  3. Android之网络丢包事件
  4. Android(安卓)线性布局详解
  5. okhttp的应用详解与源码解析--android网络请求框架发展史
  6. Android底层启动解析
  7. android gravity用法,我老是记不住
  8. Android之网络丢包事件
  9. Android之网络丢包事件

随机推荐

  1. Android(安卓)Studio代码笔记09.自定义视
  2. android 画条横线
  3. Android震动代码解读
  4. android 用到的技巧集
  5. Android: MediaScanner生成thumbnail的算
  6. Android播放视频(二)
  7. 【Android】Jetpack(二)
  8. android BitmapUtil 工具类
  9. android图像变为黑白
  10. android全屏设置