上文中介绍了SAX方式解析XML,本文着中介绍PULL方式解析XML。PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,且我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。

PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器,Android官方推荐开发者们使用Pull解析技术。Pull解析技术是第三方开发的开源技术,它同样可以应用于JavaSE开发。

PULL的工作原理:XMLpull提供了开始元素和结束元素。当某个元素开始时,我们可以调用parser.nextText从XML文档中提取所有字符数据。当解释到一个文档结束时,自动生成EndDocument事件。

常用的XML pull的接口和类:

XmlPullParser:XML pull解析器是一个在XMLPULLVlAP1中提供了定义解析功能的接口。

XmlSerializer:它是一个接口,定义了XML信息集的序列。

XmlPullParserFactory:这个类用于在XMPULLV1 API中创建XML Pull解析器。

XmlPullParserException:抛出单一的XMLpull解析器相关的错误。

PULL解析XML的过程:

读取到xml的声明返回START_DOCUMENT;

读取到xml的结束返回END_DOCUMENT ;

读取到xml的开始标签返回START_TAG

读取到xml的结束标签返回END_TAG

读取到xml的文本返回 TEXT

public class Pinfor {private String serialNumber;private String serviceid;private String type;private String data;private String title;private Object reserved;public String getSerialNumber() {return serialNumber;}public void setSerialNumber(String serialNumber) {this.serialNumber = serialNumber;}public Object getReserved() {return reserved;}public void setReserved(Object reserved) {this.reserved = reserved;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getServiceid() {return serviceid;}public void setServiceid(String serviceid) {this.serviceid = serviceid;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getData() {return data;}public void setData(String data) {this.data = data;}}


 * using pull method to parser XML file * @param  * @return */public static List<Pinfor> parserXmlByPull(String str,String encoding){Pinfor infor = null;List<Pinfor> pushInfors = null;try {XmlPullParserFactory pullParserFactory=XmlPullParserFactory.newInstance();//获取XmlPullParser的实例XmlPullParser xmlPullParser=pullParserFactory.newPullParser();//设置输入流  xml文件xmlPullParser.setInput(new ByteArrayInputStream(str.getBytes(encoding)), encoding);//xmlPullParser.setInput(inputStream, "UTF-8");//获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。int eventType = xmlPullParser.getEventType();//一直循环,直到文档结束   while (eventType != XmlPullParser.END_DOCUMENT) {String tag = xmlPullParser.getName(); switch (eventType) {case XmlPullParser.START_DOCUMENT: //文档开始事件pushInfors = new ArrayList<Pinfor>();break;case XmlPullParser.START_TAG:  //标签开始事件if (tag.equals("item")) {  //对象标签infor = new Pinfor();String attribute = xmlPullParser.getAttributeName(0);infor.setSerialNumber(attribute);}if (infor != null) {String data = null;if (tag.equals("serviceid")) { //对象属性标签data = xmlPullParser.nextText();infor.setServiceid(data);}else if (tag.equals("type")) {data = xmlPullParser.nextText();infor.setType(data);}else if (tag.equals("title")) {data = xmlPullParser.nextText();infor.setTitle(data);}else if (tag.equals("data")) {data = xmlPullParser.nextText();infor.setData(data);}else if (tag.equals("RESERVED")) {data = xmlPullParser.nextText();infor.setReserved(data);}}break;case XmlPullParser.END_TAG:if (tag.equals("item")&& infor!=null && pushInfors!=null){pushInfors.add(infor);infor = null;}break;case XmlPullParser.END_DOCUMENT:break;default:break;}eventType = xmlPullParser.next();}return pushInfors;} catch (Exception e) {// TODO Auto-generated catch blockLog4debug.e(TAG, "parserXmlByPull",e.getMessage());return null;} }


更多相关文章

  1. 巧用事件分发机制,和我一起hold住android外围设备
  2. Android(安卓)XML解析器 - DOM
  3. Android中的XML解析-DOM的使用与开发技巧
  4. 挑战和机遇并存 Android前景解析
  5. Hbuilder集成个推时Android和ISO中推送的区别
  6. Android自定义View实现竖直跑马灯效果案例解析
  7. Android无障碍服务三 创建辅助功能服务
  8. 2020上半年百度Android岗(初级到高级)面试真题全收录+解析,备战金九
  9. Android艺术开发探索第三章————View的事件体系(下)

随机推荐

  1. Android(安卓)Spinner
  2. ANDROID获取设备ID、型号及其它信息
  3. Android知识积累
  4. android中shape
  5. Android开发布局系列: LinearLayout布局实
  6. Android移动操作系统源代码
  7. Android所有系统资源图标android.R.drawa
  8. Android(安卓)RadioGroup和RadioButton使
  9. Button、选择框、日期、时间控件
  10. 【译】Android系统简介