Android 数据操作(二)Xml解析之pull解析

这一篇blog,重要来看看xml文件的Pull解析。

首先,我们自定义个AttributeSet属性:

<resources>
    <declare-styleable name="my_xml_test">
        <attr name="name" format="string"></attr>
        <attr name="age" format="integer"></attr>
        <attr name="sex" format="boolean"></attr>
        <attr name="school" format="string"></attr>
    </declare-styleable>
</resources>

之后,定义一个xml文件:xml_parser_file.xml:

<?xml version="1.0" encoding="utf-8"?>
<infos xmlns:xmltest="http://schemas.android.com/apk/res-auto">

    <studentinfo
        xmltest:name="xiaoming"
        xmltest:age="12"
        xmltest:sex="true">
        <schoolinfo
            xmltest:school="No.one">
        </schoolinfo>
        <schoolinfo
            xmltest:school="No.two">
        </schoolinfo>

    </studentinfo>

    <studentinfo
        xmltest:name="xiaohong"
        xmltest:age="15"
        xmltest:sex="false">
        <schoolinfo
            xmltest:school="No.three">
        </schoolinfo>
        <schoolinfo
            xmltest:school="No.four">
        </schoolinfo>

    </studentinfo>
</infos>
  注意:三级节点的格式。

             一开始疏忽写成了:

        <schoolinfo>
            xmltest:school="No.four"
        </schoolinfo>
结果,老半天没有解析出来。

最后是java中解析:

        XmlResourceParser parser = mContext.getResources().getXml(R.xml.xml_parser_file);
        AttributeSet attrs = Xml.asAttributeSet(parser);
        int type = -1;
        TypedArray parentArray  = null;
        TypedArray childArray = null;
        while((type = parser.next()) != XmlPullParser.END_DOCUMENT) {

            switch (type) {
                case XmlPullParser.START_TAG:
                    if(parser.getName().equals("studentinfo")) {
                        parentArray = mContext.obtainStyledAttributes(attrs, R.styleable.my_xml_test);
                        String name = parentArray.getString(R.styleable.my_xml_test_name);
                        Log.e("vnbo","vnbo name is "+name);
                    } else if(parser.getName().equals("schoolinfo")) {
                        childArray = mContext.obtainStyledAttributes(attrs, R.styleable.my_xml_test);
                        String school = childArray.getString(R.styleable.my_xml_test_school);
                        Log.e("vnbo","vnbo school is "+school);
                        childArray.recycle();
                    }

                    break;
                case XmlPullParser.END_TAG:
                    if(parser.getName().equals("studentinfo")) {
                        parentArray.recycle();
                    }
                    break;
            }
  注意:parentArray的recyle方法的调用位置。注意其调用顺序和childArray的recycle的调用相对顺序。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值