Android中使用pull解析xml文件

Android解析xml文件的时候,自己推荐是使用pull的方式来解析xml资源文件,pull方式又有两种,分别是XmlPullParser和XmlResourceParser两种。下面来分别介绍。

一: XmlPullParser方式进行布局解析。

首先看一下这个对象的数据读取方式:
parser.setInput(getResources().getAssets().open("student.xml"),
                    "UTF-8");
这里是以流的方式读取文件的,所以这个方法应该是多用在解析assets里面存放的资源文件,看具体完整代码,具体的解释在代码都已经注释:

这里写图片描述

public void parseWithoutResource() {
        // 使用android.util.Xml类里面的静态方法Xml.newPullParser()新建一个xmlpullparser对象
        XmlPullParser parser = Xml.newPullParser();
        Student student = null;
        // 给parser对象设置解析对象,它接收的是inputstream对象,所以要把文件以流的形式传进来,这里解析的是事先已经放到assets文件夹里面的xml文件。
        try {
            parser.setInput(getResources().getAssets().open("student.xml"),
                    "UTF-8");// 以UTF-8编码方式进行读取解析。
            int eventType = parser.getEventType();
            // 只要xml没有读取完毕就继续循环解析
            while (eventType != XmlPullParser.END_DOCUMENT) {
                String tagName = parser.getName();
                switch (eventType) {
                case XmlPullParser.START_DOCUMENT:// 文档解析开始
                    students = new ArrayList<Student>();
                    break;
                case XmlPullParser.START_TAG:// 解析到标签处
                    if (tagName.equals("student")) {
                        student = new Student();
                        student.setId(parser.getAttributeValue("", "id"));// 第一个参数是属性前面的命名空间,后面是属性名
                    }
                    if (student != null) {
                        if (tagName.equals("name")) {
                            student.setName(parser.nextText());//当前标签后面的文字,也就是标签内容。
                        }
                        if (tagName.equals("age")) {
                            student.setAge(parser.nextText());
                        }
                        if (tagName.equals("sex")) {
                            student.setSex(parser.nextText());
                        }
                    }

                    break;

                case XmlPullParser.END_TAG:
                    if (tagName.equals("student")) {// 在标签结束的时候检查这个节点是不是student节点,如果是的话添加到list,赋值null,继续下一个student对象解析
                        students.add(student);
                        student = null;
                    }
                    break;

                default:
                    break;
                }
                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

二 : XmlResourceParser.

名字中的resource可以看出来,这个方法主要是解析资源文件里面的xml的,看以下构造方法:

这里写图片描述

XmlResourceParser parser = getResources().getLayout(resId);
这个是通过资源文件的id读取xml文件并进行解析,以下看具体代码:
public JSONArray parseWithResource(int resId) {
        JSONArray array = new JSONArray();
        JSONObject item = null;
        // 正如函数名称一样,xml资源解析,用来解析资源文件里面的xml,获取到项目中资源之后再获取layout进行解析
        XmlResourceParser parser = getResources().getLayout(resId);
        try {
            // 获取当前解析到的标签类型
            int eventType = parser.getEventType();
            while (eventType != XmlResourceParser.END_DOCUMENT) {
                String tagName = parser.getName();
                switch (eventType) {
                case XmlResourceParser.START_TAG:
                    // 这个名字的方法名可以看出来,获取的是资源的值,也就是对用的值在R文件里面对应的整型值。
                    int id = parser.getAttributeResourceValue(NAME_SPACE, "id",
                            -1);
                    item = new JSONObject();
                    if (id != -1) {
                        if (getViewById(id) != null) {
                            item.put("id", id);
                            item.put("tagName", tagName);
                            // 不带resource的getAttributeValue直接获取属性值,第一个参数是命名空间,第二个是属性名,返回属性值。
                            String width = parser.getAttributeValue(NAME_SPACE,
                                    "layout_width");
                            String height = parser.getAttributeValue(
                                    NAME_SPACE, "layout_height");
                            String text = parser.getAttributeValue(NAME_SPACE,
                                    "text");
                            item.put("width", width);
                            item.put("height", height);
                            item.put("text", text);
                            array.put(item);
                        }
                    }
                    break;

                default:
                    break;
                }

                eventType = parser.next();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return array;
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值