除了可以使用 SAX和DOM解析XML文件,也可以使用Android内置的Pull解析器解析XML文件。
Pull解析器的运行方式与 SAX 解析器相似。它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件。事件将作为数值代码被发送,因此可以使用一个switch对感兴趣的事件进行处理。当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型元素的值。
Pull解析器的源码及文档下载网址:http://www.xmlpull.org/
person.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<persons>
<person id="21">
<name>hanmeimei</name>
<age>23</age>
</person>
<person id="27">
<name>lilei</name>
<age>25</age>
</person>
</persons>
通过Pull解析器解析xml文件代码:
/**
* 通过Pull解析器来解析xml文件
*/
public class PullPersonService {
public static List<Person> getPersons(InputStream inStream)
throws Exception {
List<Person> persons = null;
Person person = null;
// 定义XmlPullParser
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser parser = factory.newPullParser();
// 另外一种定义XmlPullParser的方法
// XmlPullParser parser = Xml.newPullParser()
// 传入一个InputStream
parser.setInput(inStream, "UTF-8");
// 取得当前解析器的参数
int event = parser.getEventType();
// 通过while循环来解析xml文件,直到结束
while (event != XmlPullParser.END_DOCUMENT) {
switch (event) {
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());
} else if ("age".equals(parser.getName())) {
person.setAge(new Short(parser.nextText()));
}
}
break;
case XmlPullParser.END_TAG:
if ("person".equals(parser.getName())) {
if (person != null) {
persons.add(person);
person = null;
}
}
break;
case XmlPullParser.END_DOCUMENT:
break;
}
event = parser.next();
}
return persons;
}
}