android解析xml文件的方式 PULL方式

  次阅读 来源:互联网(转载协议) 2016-01-13 21:59 我要评论(0)

上一节中,我们使用SAX方式解析xml文档, SAX方式是基于事件驱动的。当然android的事件机制是基于回调函数的。在这一节中,我们用另外一种方式解析xml文档,这种方式也是基于事件驱动的,与SAX方式一样,它就是PULL方式。只不过PULL方式读xml回调方法返回的是数字。

读取到xml的声明返回 START_DOCUMENT;

读取到xml的结束返回 END_DOCUMENT ;

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

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

读取到xml的文本返回 TEXT

xml数据结果还是采用我们先前使用的river.xml文件。

采用PULL方式与SAX大同小异,重点在于我们需要知道导航到什么标签时候做什么就行了,依据上一节SAX处理方式的思路,我们也可以在这一节中一样处理,基本方法是:

基本处理方式是:当PULL解析器导航到文档开始标签时就开始实例化list集合用来存贮数据对象。导航到元素开始标签时回判断元素标签类型,如果是 river标签,则需要实例化River对象了,如果是其他类型,则取得该标签内容并赋予River对象。当然它也会导航到文本标签,不过在这里,我们可以不用。

根据以上的解释,我们可以得出以下处理xml文档逻辑:

1:当导航到XmlPullParser.START_DOCUMENT,可以不做处理,当然你可以实例化集合对象等等。

2:当导航到XmlPullParser.START_TAG,则判断是否是river标签,如果是,则实例化river对象,并调用 getAttributeValue方法获取标签中属性值。

3:当导航到其他标签,比如Introduction时候,则判断river对象是否为空,如不为空,则取出Introduction中的内容,nextText方法来获取文本节点内容

4:当然啦,它一定会导航到XmlPullParser.END_TAG的,有开始就要有结束嘛。在这里我们就需要判读是否是river结束标签,如果是,则把river对象存进list集合中了,并设置river对象为null.

由以上的处理逻辑,我们可以得出以下代码

View Code

复制代码

public List < River > parse(String xmlPath){ List < River > rivers = new ArrayList < River > (); River river = null ; InputStream inputStream = null ; // 获得XmlPullParser解析器 XmlPullParser xmlParser = Xml.newPullParser(); try { // 得到文件流,并设置编码方式 inputStream = this .context.getResources().getAssets().open(xmlPath); xmlParser.setInput(inputStream, " utf-8 " ); // 获得解析到的事件类别,这里有开始文档,结束文档,开始标签,结束标签,文本等等事件。 int evtType = xmlParser.getEventType(); // 一直循环,直到文档结束 while (evtType != XmlPullParser.END_DOCUMENT){ switch (evtType){ case XmlPullParser.START_TAG: String tag = xmlParser.getName(); // 如果是river标签开始,则说明需要实例化对象了 if (tag.equalsIgnoreCase(RIVER)) { river = new River(); // 取出river标签中的一些属性值 river.setName(xmlParser.getAttributeValue( null , NAME)); river.setLength(Integer.parseInt(xmlParser.getAttributeValue( null , LENGTH))); } else if (river != null ){ // 如果遇到introduction标签,则读取它内容 if (tag.equalsIgnoreCase(INTRODUCTION)){ river.setIntroduction(xmlParser.nextText()); } else if (tag.equalsIgnoreCase(IMAGEURL)){ river.setImageurl(xmlParser.nextText()); } } break ; case XmlPullParser.END_TAG: // 如果遇到river标签结束,则把river对象添加进集合中 if (xmlParser.getName().equalsIgnoreCase(RIVER) && river != null ) { rivers.add(river); river = null ; } break ; default : break ; } // 如果xml没有结束,则导航到下一个river节点 evtType = xmlParser.next(); } } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return rivers; }

复制代码

运行结果与其他2个一样:

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...