framework中的xml解析学习

在frameworks中使用了大量的xml进行数据保存,列如frameworks/base/services/core/java/com/android/server/pm/Settings.java源码中将已安装的包名进行了相关实践。因此在自行实现的xml中可参考以下实现。

boolean readLPw(@NonNull List<UserInfo> users) {
        FileInputStream str = null;
        try {
            if (str == null) {
                if (!mSettingsFilename.exists()) {//如果文件不存在则进行返回
                    return false;
                }
                str = new FileInputStream(mSettingsFilename);
            }
            //实例化XmlPullParser对象
            XmlPullParser parser = Xml.newPullParser();
            parser.setInput(str, StandardCharsets.UTF_8.name());//设置输入流

            //检查是否可以读取到START_TAG或者END_DOCUMENT
            int type;
            while ((type = parser.next()) != XmlPullParser.START_TAG
                    && type != XmlPullParser.END_DOCUMENT) {
                ;
            }
            //若没有读取到开始标签则表示不合法
            if (type != XmlPullParser.START_TAG) {
                return false;
            }
            //获取元素深度
            int outerDepth = parser.getDepth();
            //如果没有读取到文档结尾并且(不是结束标签或者元素深度没有达到最大)则进行读取
            while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
                    && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
                //如果直接读取到了元素结尾或者读取到了元素中间的文本则跳过
                if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
                    continue;
                }

                String tagName = parser.getName();
                /**
                *解析package节点
                */
                if (tagName.equals("package")) {
                    readPackageLPw(parser);
                } else if (tagName.equals("permissions")) {
                    mPermissions.readPermissions(parser);
                } 
                //解析到其它节点逻辑
                。。。。。。。。
                else {
                //若这个节点是无法解析的则进行跳过
                    XmlUtils.skipCurrentTag(parser);
                }
            }

            str.close();

        } catch (XmlPullParserException e) {
        } catch (java.io.IOException e) {
        }
        return true;
    }

    void writeLPr() {

        try {
        //实例化输出流
            FileOutputStream fstr = new FileOutputStream(mSettingsFilename);
            BufferedOutputStream str = new BufferedOutputStream(fstr);
            //XmlSerializer构建解析器
            XmlSerializer serializer = new FastXmlSerializer();
            //设置输出流以及编码
            serializer.setOutput(str, StandardCharsets.UTF_8.name());
            //设置开始标签
            serializer.startDocument(null, true);
            //定义Feature属性
            serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
            //设置开始标签
            serializer.startTag(null, "packages");
            //迭代数据并写入相应的子标签
            for (int i = 0; i < mVersion.size(); i++) {
                final String volumeUuid = mVersion.keyAt(i);
                final VersionInfo ver = mVersion.valueAt(i);

                serializer.startTag(null, TAG_VERSION);
                XmlUtils.writeStringAttribute(serializer, ATTR_VOLUME_UUID, volumeUuid);
                XmlUtils.writeIntAttribute(serializer, ATTR_SDK_VERSION, ver.sdkVersion);
                XmlUtils.writeIntAttribute(serializer, ATTR_DATABASE_VERSION, ver.databaseVersion);
                XmlUtils.writeStringAttribute(serializer, ATTR_FINGERPRINT, ver.fingerprint);
                serializer.endTag(null, TAG_VERSION);
            }
            //设置结束标签
            serializer.endTag(null, "packages");
            //结束文档
            serializer.endDocument();
            //写入完成
            str.flush();
            //同步到本地磁盘
            FileUtils.sync(fstr);
            //关闭流
            str.close();

        } catch(java.io.IOException e) {
        }

    }

发表回复

CAPTCHAis initialing...