在前一篇中介绍了使用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; } @Override public 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的日志记录如下: