Android解析XML方式(二)使用PULL解析XML
在前一篇中介绍了使用SAX解析XML,本篇来讲一下如何使用JAVA自带的PULL来解析XML数据,以及它们的各自优点在哪里。
首先来看一下什么是PULL解析器以及它的基本特征:
PULL解析器的运行方式和SAX解析器很相似,它提供了类似的事件,如:开始元素和结束元素,使用parser,next() 可以进入下一个元素并且触发相应的事件,事件将作为代码被发送,因此可以使用一个switch来对事件进行选择,然后进行相应的处理。当开始解析元素的时候,调用parser.nextText()方法可以获得下一个Text类型的元素。
相对而言,使用PULL来解析比SAX要写的代码少很多,使用比较简单。
PULL的特点:
一、简单的结构:一个接口、一个例外、一个工厂组成的PULL解析器
二、简单易用:PULL解析器只有一个重要的方法next方法,他被用来检索下一个事件,而它只有5个常用的属性:
1、STARTDOCUMENT
2、START_TAG
3、TEXT
4、END_TAG
5、END_DOCUMENT
这里同样通过一个例子来看一下如何使用它,我们建立一个工程Android_XML_PULL
工程目录结构:
源代码如下:
person.xml
<?xml version="1.0" encoding="utf-8"?><persons> <person id="1"> <name>liming</name> <age>23</age> </person> <person id="2"> <name>zhangsan</name> <age>32</age> </person></persons>
Person.java
package com.pull.bean;public class Person {private int id;private String name;private String age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";}}
PersonService.java
package com.pull.service;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import org.xmlpull.v1.XmlPullParserException;import android.util.Xml;import com.pull.bean.Person;public class PersonService {public static List<Person> getPersons(InputStream xml) throws IOException{List<Person> persons = null;Person person = null;XmlPullParser pullParser = Xml.newPullParser();try {pullParser.setInput(xml,"UTF-8");//为PULL解析器设置要解析的XML数据int event = pullParser.getEventType();while(event!=XmlPullParser.END_DOCUMENT){switch (event) {case XmlPullParser.START_DOCUMENT:persons = new ArrayList<Person>();break;case XmlPullParser.START_TAG:if("person".equals(pullParser.getName())){int id = new Integer(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())){String age = pullParser.nextText();person.setAge(age);}break;case XmlPullParser.END_TAG:if("person".equals(pullParser.getName())){persons.add(person);person = null;}break;}event = pullParser.next();}} catch (XmlPullParserException e) {e.printStackTrace();}return persons;}}
PersonServiceTest.java
package com.pull.test;import java.io.IOException;import java.io.InputStream;import java.util.List;import com.pull.bean.Person;import com.pull.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase{private static final String TAG = "PersonServiceTest";public void testPersons() throws IOException{InputStream xml = this.getClass().getClassLoader().getResourceAsStream("person.xml");List<Person> persons = PersonService.getPersons(xml);for(Person person:persons){Log.i(TAG, person.toString());}}}
<uses-library android:name="android.test.runner"/>
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.pull.activity" android:label="Tests for My App "/>
我们通过运行testPersons()这个测试方法,输出到LogCat的日志记录如下: