博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android中XML的解析--使用PULL
阅读量:5878 次
发布时间:2019-06-19

本文共 4186 字,大约阅读时间需要 13 分钟。

一、用什么解析XML

Android中一般有三种方式解析XML:Simple API for XML(SAX) 、 Document Object Model(DOM)和Android附带的pull解析器,这次我就来分享一下使用PULL解析器来解析XML。

二、解析辣锅XML嘛

可以选择在asset中创建个XML,也可以在res文件夹中添加,这里我采用的第二种方法,在res中新建了一个xml文件夹,添加了个xml,//然后洗净切丝备用。

xml中就随便写了写:

三、开始解析

1.用啥子来解析呢?

开头说了,我们使用pull解析器:XmlPullParser,不过使用这个需要pull的jar包,所以我们可以换一个:XmlResourceParser,这个是Android自带的。

/** * The XML parsing interface returned for an XML resource.  This is a standard * XmlPullParser interface, as well as an extended AttributeSet interface and * an additional close() method on this interface for the client to indicate * when it is done reading the resource. */public interface XmlResourceParser extends XmlPullParser, AttributeSet, AutoCloseable {    /**     * Close this interface to the resource.  Calls on the interface are no     * longer value after this call.     */    public void close();}复制代码

可以看出来,XmlResourceParser继承自XmlPullParser。

现在我们厨具(XmlResourceParser)有了,食材(XML文件)也齐了,那么可以直接上了么?不过,是不是缺了个盘子来盛菜。

2.准备个类来放解析出的数据

其实这步骤不做也可以(就着锅来吃,那不是就成火锅了么),我这里还是啰嗦一下,创建了Item类。

class Item {        private String title;        private int type;        public Item() {            title = " ";            type = -1;        }        public String getTitle() {            return title;        }        public void setTitle(String title) {            this.title = title;        }        public int getType() {            return type;        }        public void setType(int type) {            this.type = type;        }        @Override        public String toString() {            return "title: " + title + " type: " + type;        }    }复制代码

这个类没什么好说的(我重写toString方法也就为了之后显示结果方便点)。

3. 先看看食谱,怎么解析的

解析的原理是:解析器(parser)读取一个tag,解析后返回这个tag的eventType(有10种,之后说明),而我们通过判断不同类型采取对应操作。

10种eventType

"START_DOCUMENT",
"END_DOCUMENT",
"START_TAG",
"END_TAG",
"TEXT",
"CDSECT",
"ENTITY_REF",
"IGNORABLE_WHITESPACE",
"PROCESSING_INSTRUCTION",
"COMMENT",
"DOCDECL"

我们可以重点关注这四个,START_DOCUMENT:xml文档的开头,END_DOCUMENT文档结束标志,START_TAG:tag开始标志,比如<tabs>,END_TAG:tag结束标志,比如</tabs>

多说无益,放码过来

//parser.getEventType() 这句会抛出异常,那我们就直接上抛异常吧public List
parse(XmlResourceParser parser) throws Exception { List
items = null; Item item = null; //获取事件类型 int eventType = parser.getEventType(); //不是文件结尾就继续循环 while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { //遇到文件开头,这里可以做一些初始化 case XmlPullParser.START_DOCUMENT: items = new ArrayList<>(); break; //碰到一个tag的开始,接下来通过getName看看这个tag是什么 case XmlPullParser.START_TAG: if ("item".equals(parser.getName())) { //这个tag是
item = new Item(); //读取item的第一个属性:type item.setType(Integer.parseInt(parser.getAttributeValue(0))); } else if ("title".equals(parser.getName())) { //这个tag是
,读取tag内的内容 item.setTitle(parser.nextText()); } break; //碰到tag的结尾 case XmlPullParser.END_TAG: if ("item".equals(parser.getName())) { //表明这个结尾是</item> items.add(item); item = null; } break; default://写个default,好习惯 break; } //结束,下一个 eventType = parser.next(); } return items; }复制代码

4.准备就绪,解析吧

List
items; try { //我的xml放在了res中,所以用getResources来获取, //放在asset中的就通过getAsset来获取InputStream, //通过Xml.newPullParser()来获取XmlPullParser, //XmlPullParser可以通过setInput(InputStream)来读入xml文件 XmlResourceParser xmlparser = getResources().getXml(R.xml.tabs); items = parse(xmlparser); for (Item i : items) { Log.v("ParserXML", i.toString()); } } catch (Exception e) { e.printStackTrace(); Log.v("testXML", e.toString()); }复制代码

O了个轮询调度算法K

//作为Android开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步

转载地址:http://abcix.baihongyu.com/

你可能感兴趣的文章
[转]轻松实现可伸缩性,容错性,和负载平衡的大规模多人在线系统
查看>>
五 数组
查看>>
也谈跨域数据交互解决方案
查看>>
EntityFramework中使用Include可能带来的问题
查看>>
activity 用 service 更新界面
查看>>
我的时间管理——充分利用WindowsPhone、Android等设备,实现真正的无压工作!
查看>>
面试题28:字符串的排列
查看>>
GetParent( ) 和AfxGetMainWnd( )
查看>>
css important
查看>>
VUE -- 如何快速的写出一个Vue的icon组件?
查看>>
服务器的svnserver修改密码
查看>>
利用 fdisk进行分区
查看>>
WPF 实现窗体拖动
查看>>
来自维基百科程序员Brandon Harris
查看>>
NULL不是数值
查看>>
CentOS 5 全功能WWW服务器搭建全教程
查看>>
30个优秀的后台管理界面设计案例分享
查看>>
scala111
查看>>
模块化服务规范——OSGI
查看>>
劣质代码评析——猜数字问题(上)
查看>>