此文章仅作为学习交流所用
转载或引用请务必注明原文地址:
http://blog.csdn.net/luzhenrong45/article/
或联系作者:[email protected]
谢谢!
------------------------------------------------------------------------------------------------------
一.Pull 介绍
Android开发官网对于Pull的介绍: http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html
Pull解析和Sax解析很相似,都是轻量级的解析,在Android的内核中已经嵌入了Pull,所以我们不需要再添加第三方jar包来支持Pull. Android系统中采用Pull技术解析XML文档比用SAX技术性能要好得多。建议Android的开发者采用PULL技术解析XML文档。跟SAX类似,它提供了类似的事件,如开始元素,结束元素事件.只不过PULL技术返回的事件类型是整型,所以我们只要对返回的事件进行处理就行了。Pull解析使用parser.next()可以进入下一个元素并触发相应事件.调用Pull与SAX不同的是,SAX的事件驱动是回调相应方法,需要提供回调的方法,而后在SAX内部自动调用相应的方法,而Pull解析器并没有强制要求提供触发的方法,因为它触发的事件并不是一个方法,而是一个常量数字.至于要不要处理,由程序员自己决定,可通过switch方法进行选择.
Pull解析器的事件只有5个:
START_DOCUMENT (常量0) START_TAG (常量2) TEXT (常量4) END_TAG (常量3) END_DOCUMENT (常量1)
二. 使用Pull解析XML步骤
(1)取得pull解析器
XmlPullParser parser = Xml.newPullParser();
(2)设置解析器的输入流
parser.setInput(inStream, "UTF-8");
(3)产生第一个事件
int eventType=pullParser.getEventType();//触发第一个事件
(4)开始解析
判断是否 是文件开始:XmlPullParser.START_DOCUMENT: 判断是否是标签开始:XmlPullParser.START_TAG 判断是否是标签结束:XmlPullParser.END_TAG 判断是否是文件结尾:XmlPullParser.END_DOCUMENT
(5)将指针往下推
parser.next();
(6)解析结束
三. Pull解析Demo
(一)仍然以前面两篇文章介绍的工程来实现Pull对XML文件的解析。
<?xml version="1.0" encoding="UTF-8"?> <persons> <person id="0"> <name>刘德华</name> <sex>男</sex> <age>21</age> </person> <person id="1"> <name>张漫玉</name> <sex>女</sex> <age>22</age> </person> <person id="2"> <name>张易谋</name> <sex>男</sex> <age>23</age> </person> <person id="3"> <name>周新驰</name> <sex>未知</sex> <age>24</age> </person> <person id="4"> <name>纳兰容若</name> <sex>男</sex> <age>25</age> </person> </persons>
(2)PullParseService.java (核心代码)
package com.laolu.parser; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.xmlpull.v1.XmlPullParser; import android.util.Xml; public class PullParserService { List<Map<String,Object>> persons=null; Map<String,Object> person=null; public PullParserService() {} public List<Map<String,Object>> getPersons(InputStream inputStream) throws Exception { XmlPullParser pullParser=Xml.newPullParser(); pullParser.setInput(inputStream, "UTF-8"); int eventType=pullParser.getEventType();//触发第一个事件 while(eventType!=XmlPullParser.END_DOCUMENT) { switch(eventType) { case XmlPullParser.START_DOCUMENT: persons=new ArrayList<Map<String,Object>>(); break; case XmlPullParser.START_TAG: if("person".equals(pullParser.getName().trim())) { person=new HashMap<String,Object>(); String id=pullParser.getAttributeValue(0); person.put("id", id); } if(person!=null) { if("name".equals(pullParser.getName().trim())) { String name=pullParser.nextText(); person.put("name", name); }else if("sex".equals(pullParser.getName().trim())) { String sex=pullParser.nextText(); person.put("sex", sex); }else if("age".equals(pullParser.getName().trim())) { String age=pullParser.nextText(); person.put("age", age); } } break; case XmlPullParser.END_TAG: if("person".equals(pullParser.getName().trim())) { persons.add(person); person=null; } break; } eventType=pullParser.next(); } return persons; } }