Android系统还提供了另一种XML解析方式可以使你更好的处理这种情况,就是Pull方式解析XML数据。Pull解析xml项目是一个开源的项目,只不过android系统将它集中进去了。
官网:http://www.xmlpull.org
Pull解析器和SAX解析器虽有区别但也有相似性。他们的区别为:SAX解析器的工作方式是自动将事件推入注册的事件处理器进行处理,因此你不能控制事件的处理主动结束;而Pull解析器的工作方式为允许你的应用程序代码主动从解析器中获取事件,正因为是主动获取事件,因此可以在满足了需要的条件后不再获取事件,结束解析。这是他们主要的区别。
而他们的相似性在运行方式上,Pull解析器也提供了类似SAX的事件(开始文档START_DOCUMENT和结束文档END_DOCUMENT,开始元素START_TAG和结束元素END_TAG,遇到元素内容TEXT等),但需要调用next() 方法提取它们(主动提取事件)。
Android系统中和Pull方式相关的包为org.xmlpull.v1,在这个包中提供了Pull解析器的工厂类XmlPullParserFactory和Pull解析器XmlPullParser,XmlPullParserFactory实例调用newPullParser方法创建XmlPullParser解析器实例,接着XmlPullParser实例就可以调用getEventType()和next()等方法依次主动提取事件,并根据提取的事件类型进行相应的逻辑处理。
下面看看pull技术具体如何解析xml文件。
依然是解析这个简单的文件:
-
<?xml version="1.0" encoding="UTF-8"?>
-
<persons>
-
<person id="1">
-
<name>Lucy</name>
-
<age>15</age>
-
</person>
-
<person id="2">
-
<name>Tim</name>
-
<age>20</age>
-
</person>
-
</persons>
解析代码:
-
public void pullParseXml() throws XmlPullParserException, IOException {
-
// 构建解析器
-
XmlPullParser parser = Xml.newPullParser();
-
// 获得xml文件的输入流,获得文档对象
-
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.xml");
-
parser.setInput(inputStream, "UTF-8");
-
//开始解析
-
int eventType=parser.getEventType();//产生第一个事件
-
List<Person> persons=null;
-
Person person=null;
-
while (eventType!=XmlPullParser.END_DOCUMENT) {//循环条件 文档结束
-
switch (eventType) {//判断事件的类型
-
case XmlPullParser.START_DOCUMENT: //开始文档
-
persons=new ArrayList<Person>();
-
break;
-
case XmlPullParser.START_TAG: //开始元素节点
-
String name1=parser.getName();//获 取解析器当前指向元素节点的名称
-
if("person".equals(name1)){//如果指向person节点
-
person=new Person();
-
person.setId(new Integer(parser.getAttributeValue(0)));//获取索引为0的属性的值
-
}else if ("name".equals(name1)) {
-
person.setName(parser.nextText());//取得当前节点 下一个的文本节点的值
-
}else if ("age".equals(name1)) {
-
person.setAge(new Integer(parser.nextText()));//取得当前节点 下一个的文本节点的值
-
}
-
break;
-
case XmlPullParser.END_TAG://结束元素节点
-
String name2=parser.getName();
-
if("person".equals(name2)){//如果指向/person节点
-
persons.add(person);
-
person=null;
-
}
-
break;
-
}
-
eventType=parser.next();//解析器向下移动一个单位
-
}
-
for (Person p : persons) {
-
System.out.println(p.getId() + "--" + p.getName() + "---" + p.getAge());
-
}
-
}