Pull解析器的运行方式与SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
package com.scl.parse;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import com.scl.domain.Person;
import android.util.Xml;
public class PullParsePerson {
public List<Person> getPerson(InputStream in) throws Exception{
List<Person> persons = null;
Person person = null;
//获得pull解析器
XmlPullParser parser = Xml.newPullParser();
//往解析器里放入输入流
parser.setInput(in, "UTF-8");
//获得事件类型
int eventType = parser.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT){
switch(eventType){
//在文档开头初始化一些数据
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
//开始某个节点
case XmlPullParser.START_TAG:
if("person".equals(parser.getName())){
person = new Person();
person.setId(new Integer(parser.getAttributeValue(0)));
}
if(person != null){
if("name".equals(parser.getName())){
person.setName(parser.nextText());
}
if("age".equals(parser.getName())){
person.setAge(new Short(parser.nextText()));
}
}
break;
//结束某个节点
case XmlPullParser.END_TAG:
if("person".equals(parser.getName())){
persons.add(person);
person = null;
}
break;
}
//获得下一个事件类型
eventType = parser.next();
}
//文档解析结束
return persons;
}
}