ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

XmlPullParser 解析xml文件

2022-01-13 14:04:40  阅读:227  来源: 互联网

标签:xml tmp parser perm XmlPullParser TAG 解析 type


实例 

<permissionlist>
    <package 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>
    <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 > ; <xxx  />  这个格式的都属于 TAG, 即用 xmlPullParser.getEventType()  和 parser.next() 函数判断

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;

    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事件
 

标签:xml,tmp,parser,perm,XmlPullParser,TAG,解析,type
来源: https://blog.csdn.net/kanyou222/article/details/122469021

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有