除了可以使用 SAX和DOM解析XML文件,大家也可以使用Android内置的Pull解析器解析XML文件。 Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值。
以下问使用pull解析器对xml文件进行解析的代码:
package com.test.service;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.xmlpull.v1.XmlPullParser;
import android.util.Xml;
import com.test.bean.Person;
public class PULLPersonService {
public static List<Person> getPersons(InputStream inStream) throws Throwable {
List<Person> persons =null;
Person person = null;
XmlPullParser XmlParser = Xml.newPullParser();
XmlParser.setInput(inStream, "UTF-8");
int eventType = XmlParser.getEventType(); //产生第一个事件。
while(eventType!=XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_DOCUMENT:
persons = new ArrayList<Person>();
break;
case XmlPullParser.START_TAG:
String name = XmlParser.getName(); //获得当前解析器指向的元素的名称
if(name.equals("person")){
person = new Person();
person.setId(new Integer(XmlParser.getAttributeValue(0)));
}
if(person!=null){
if(name.equals("name")){
person.setName(XmlParser.nextText());//获得当前解析器指向元素的下个文本节点的值
}
if(name.equals("age")){
person.setAge(new Short(XmlParser.nextText() ));
}
}
break;
case XmlPullParser.END_TAG:
if("person".equals(XmlParser.getName())){
persons.add(person);
person = null;
}
break;
}
eventType = XmlParser.next();
}
return persons;
}
}
下面为 单元测试代码:
public void testPULLGetPersons() throws Throwable {
InputStream inStreamForPull = this.getClass().getClassLoader()
.getResourceAsStream("itcast.xml");
List<Person> persons = PULLPersonService.getPersons(inStreamForPull);
for (Person person : persons) {
Log.i(TAG, person.toString());
}
}