android之Xml的高效解析方式——pull

我们知道,解析XML在各个平台使用也非常广泛,android也是一样,经常会涉及到XML的解析读取,解析方式主要有三种:SAX解析器、DOM解析器和PULL解析器。
SAX解析器:它的核心是事件处理模式,主要是围绕着事件源以及事件处理器来工作的,也就是ContentHandler为重要核心,解析过程中每遇到一个事件源,只有调用事件解析器才能得到相应的处理;不过它的优点主要是解析速度快,占用内存少。非常适合在Android移动设备中使用;
DOM解析器:dom解析的原理是基于树形的结构和信息数据集合,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对XML文件进行表示,利用DOM中的对象,可以对XML文档进行读取、搜索、修改、添加和删除等操作。
PULL解析器:PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中,我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码。PULL解析器小巧轻便,解析速度快,简单易用,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

接下来我们重点了解一下PULL解析器的简单使用方式:

首先我们在assets中放入一个xml文件:
这里写图片描述

接下来我们就通过pull的方式读取xml中几个控件的ID名称,这里要注意的是,调用pullParser.getAttributeValue()时,通常我们可以根据传入的数字下表可以取出标签的属性值,也就是pullParser.getAttributeValue(1),但是如果你想要根据属性名称获取属性值的话,就得写成:pullParser.getAttributeValue(null, "id")。ok,下面我们直接看完整的代码演示:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv_text = (TextView) findViewById(R.id.tv_text);
        try {
            //得到XML解析器
            XmlPullParser pullParser = Xml.newPullParser();
            InputStream is = getAssets().open("activity_main.xml");
            pullParser.setInput(is, "utf-8");
            //得到事件类型
            int eventType = pullParser.getEventType();
            //文档的末尾
            //遍历内部的内容
            StringBuilder stringBuilder = new StringBuilder();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String name = pullParser.getName();
                if (!TextUtils.isEmpty(name))
                    if (eventType == XmlPullParser.START_TAG) {
                        String attributeValue = pullParser.getAttributeValue(null, "id");
                        attributeValue = attributeValue.substring(attributeValue.indexOf("/") + 1, attributeValue.length());

                        stringBuilder.append("name====");
                        stringBuilder.append(name);
                        stringBuilder.append("\t\tid====");
                        stringBuilder.append(attributeValue);
                        stringBuilder.append("\n\n");
                    }
                eventType = pullParser.next();//读取下一个标签
            }
            tv_text.setText(stringBuilder.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行效果如下:
这里写图片描述

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值