XmlPullParser 解析xml文件

实例 

<permissionlist>
    <package name="com.coolpad.coolclean">   //next()或者  getEventType() 函数是获取TAG 的 。 
这条是 START_TAG, getName()函数获取到 TAG中的名称 package ,getAttributeValue(null, "name") 这个函数获取到 属性name中的值“com.coolpad.coolclean”
        <perm name="android.permission.READ_PHONE_STATE" />
        <perm name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <perm name="android.permission.READ_EXTERNAL_STORAGE" />
    </package> //这是END_TAG (调用getName()会获取到 名称package), 再调用next函数会读取到 TEXT 标签
    <package name="com.yulong.coolfuncservice">
        <perm name="android.permission.READ_PHONE_STATE" />
        <perm name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </package>
    <package name="com.yulong.membercenter">
        <perm name="android.permission.READ_PHONE_STATE" />
    </package>
    <package name="com.yulong.android.gallery">
        <perm name="android.permission.READ_EXTERNAL_STORAGE" />
        <perm name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </package>
</permissionlist>

上面的xml 文件,< xxx   >  </xxx > ; <xxx  />  这个格式的都属于 TAG, 即用 XmlPullParser.getEventType()  和 parser.next() 函数判断, 而里面的 xxx 是用 getName()函数获取的。 next() 是获取下一个TAG,

XmlPullParser.next(); 函数返回一个START_TAG,
getName(); 获取到 "permissionlist" 内容
next(); 获取到TEXT TAG
getName(); 为NUll

next(); 获取到START_TAG,
getName();  获取到 "package"
getAttributeValue(null, "name"); 获取到属性name的值 "com.coolpad.coolclean"
next(); 获取到START_TAG,
getName(); 获取到 "perm"
getAttributeValue(null, "name"); 获取到属性name的值 "android.permission.READ_PHONE_STATE"

next(); 获取到END_TAG
getName(); 获取到 "perm"
next(); 获取到TEXT TAG




java 解析

private void doReadXml() {
    Log.d(TAG,"phg__ doReadXml");
    AtomicFile whiteListFile = new AtomicFile(new File(NEWPATH, WHITEFILE));
    XmlPullParser xmlPullParser = Xml.newPullParser();
    InputStream infile = null;

    try {
        infile = whiteListFile.openRead();
        xmlPullParser.setInput(infile, StandardCharsets.UTF_8.name());
        int type = xmlPullParser.getEventType(); 
        while (type != XmlPullParser.END_DOCUMENT) {
            switch (type) {
                case XmlPullParser.START_TAG:  //  start tag
                    switch (xmlPullParser.getName()) {
                        case TAG_WHITELIST:
                            readWhiteListXml(xmlPullParser);
                            break;
                        case TAG_PERMISSIONS:
                            readPkgXml(xmlPullParser);  // 解析第二段
                            break;
                        default:
                            break;
                    }
            }
            // Circular resolution
            type = xmlPullParser.next();
        }
    } catch (Exception e) {
        Log.e(TAG, "phg__  Unable to read notification policy" + e);
    } finally {
        IoUtils.closeQuietly(infile); // After finished read, delete the atomic file
    }
}

private void readPkgXml(XmlPullParser parser)
        throws IOException, XmlPullParserException {
    final int outerDepth = parser.getDepth(); // 获取当前的深度
    int type;

  // next()读取下一个TAG。判断不是文件结尾 && (不是END_TAG || 深度更深)
    while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
            && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
        //
        if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
            if (TAG_PERMISSIONS.equals(parser.getName()))
                return;
            continue;
        }

        switch (parser.getName()) {
            case TAG_PACKAGE:
                String pkgName = parser.getAttributeValue(0);
                Log.d(TAG,">>> pkgName =" + pkgName);  // 打印log
                List<String> perms = getPermissions(pkgName);
                readPermsXml(parser, perms,TAG_PACKAGE,TAG_PERMS);
                break;
        }
    }
}

private void readPermsXml(XmlPullParser parser, List<String> perms, final String tag1, final String tag2)
        throws IOException, XmlPullParserException {
    final int outerDepth = parser.getDepth();
    int type;
    while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
            && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
        if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
            String tmp = parser.getName();
            Log.d(TAG,">>> tmp " + tmp);
            if (tag1.equals(tmp))
                return;
            continue;
        }

        String tmp2 = parser.getName();
        Log.d(TAG,">>> tmp2 = " + tmp2);
        if (tag2.equals(parser.getName())) {
            String permName = parser.getAttributeValue(null, ATTR_NAME);
            Log.d(TGA,">>> permName = " + permName);           
            if (!perms.contains(permName)) {
                perms.add(permName);
            }
            break;
        }
    }
}
>>> pkgName = com.coolpad.coolclean
>>> tmp null  // <package name="com.coolpad.coolclean"> TEXT 后面 获取到null
>>> tm2 = perm 
>>> permName = android.permission.READ_PHONE_STATE
>>> tmp perm
>>> tmp null
>>> tm2 = perm
>>> permName = android.permission.WRITE_EXTERNAL_STORAGE
>>> tmp perm
>>> tmp null
>>> tm2 = perm
>>> permName = android.permission.READ_EXTERNAL_STORAGE
>>> tmp perm
>>> tmp null
>>> pkgName = com.yulong.coolfuncservice
>>> tmp null
>>> tm2 = perm
>>> permName = android.permission.READ_PHONE_STATE
>>> tmp perm
>>> tmp null
>>> tm2 = perm
>>> permName = android.permission.WRITE_EXTERNAL_STORAGE
>>> tmp perm
>>> tmp null
>>> pkgName = com.yulong.membercenter
>>> tmp null
>>> tm2 = perm
>>> permName = android.permission.READ_PHONE_STATE
>>> tmp perm
>>> tmp null

<a> ... </a>这种形式的标签,解析时会读取到两个TEXT事件:一个在<a> (这是START_TAG)之后产生,一个在</a> (这是END_TAG)之后产生
<b />这种形式的标签只会在<b> END_TAG之后读取到一个TEXT事件,<b> START_TAG之后不会产生TEXT事件

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值