android提供了一种新的解析XML的方式-------PULL,这种方式是android推荐使用的,它的代码简单,内容看起来更加紧凑与直观,解析方式性能上与SAX相近,都是使用事件驱动的方式进行解析,不同的是PULL返回的时间类型是整型.
过程如下:
创建工厂类XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
申明工厂类支持命名空间factory.setNamespaceAware(true);
创建解析器 XmlPullParser xpp = factory.newPullParser();
设置解析内容xpp.setInput(getAssets().open("min.xml"), "UTF-8");
开始解析:
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if(eventType == XmlPullParser.START_DOCUMENT) {
persons = new ArrayList<Person>();
}else if(eventType == XmlPullParser.START_TAG) {
//Log.d("minrui","Start tag "+xpp.getName());
if("person".equals(xpp.getName())){
person = new Person();
person.setId(new Integer(xpp.getAttributeValue(0)));
}
preTag = xpp.getName();
} else if(eventType == XmlPullParser.END_TAG) {
// Log.d("minrui","End tag "+xpp.getName());
if("person".equals(xpp.getName())&&person!=null){
persons.add(person);
person = null;
}
preTag = null;
}else if(eventType == XmlPullParser.TEXT) {
// Log.d("minrui","Text "+xpp.getText());
if(person!=null){
String data = xpp.getText();
if("name".equals(preTag)){
person.setName(data);
}else if ("age".equals(preTag)){
person.setAge(new Short(data));
}
}
}
eventType = xpp.next();
}
最后测试:
List<Person> l = persons;
for(int i=0;i<l.size();i++) {
Person p = l.get(i);
Log.d("minrui","p.getAge() = "+p.getAge());
Log.d("minrui","p.getId() = "+p.getId());
Log.d("minrui","p.getName() = "+p.getName());
}
打出与上一节中相同的LOG
01-01 10:12:35.363: DEBUG/minrui(5080): p.getAge() = 30
01-01 10:12:35.363: DEBUG/minrui(5080): p.getId() = 0
01-01 10:12:35.363: DEBUG/minrui(5080): p.getName() = min
01-01 10:12:35.363: DEBUG/minrui(5080): p.getAge() = 25
01-01 10:12:35.363: DEBUG/minrui(5080): p.getId() = 1
01-01 10:12:35.363: DEBUG/minrui(5080): p.getName() = malone
可以看到,PULL的实现过程更加的简洁和明了.这种方法与SAX有共同的缺点,解析过程中如果出现错误,立即终止,要针对每一个XML文档写一个解析类,没有通用性