Android中XML的解析--使用PULL

一、用什么解析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<Item> parse(XmlResourceParser parser) throws Exception {
        List<Item> 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>
                        item = new Item();
                        //读取item的第一个属性:type
                        item.setType(Integer.parseInt(parser.getAttributeValue(0)));
                    } else if ("title".equals(parser.getName())) {
                        //这个tag是<title>,读取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<Item> 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开发的初学者,如果我有错误的地方或者不足的话欢迎大家指正。希望与大家一同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值