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

来源:互联网 发布:7.0数据库 编辑:程序博客网 时间:2024/05/22 12:57

我们知道,解析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();        }    }}

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

0 0
原创粉丝点击