前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2-SIII-Android数据固化之Xml的Pull解析和存储

2-SIII-Android数据固化之Xml的Pull解析和存储

作者头像
张风捷特烈
发布2018-09-29 11:23:13
6240
发布2018-09-29 11:23:13
举报
零、前言

Xml是一种应用广泛的标记语言,我们常见的html便是它的子集。形如:<XXX>xxx</XXX>组成的闭合标签 安卓的res目录下的xml想必大家都是否熟悉,它们最终都是在代码中被读取并解析发挥效果的 安卓的SharedPreferences是以Xml的形式存储数据的,就连AndroidManifest注意一看也是Xml 可以说xml涉及到了安卓的很多方面,我们并不陌生,Xml最大的好处就是解耦,容易复用和更换 安卓的Xml解析有Pull解析、Sax解析和Dom解析,这篇先说Pull解析 先读一个xml,再将这个xml写入SD卡(运行时权限自己注意)

pull解析.png

Pull解析概述
代码语言:javascript
复制
Pull是安卓内置的,基于事件触发的解析器
Pull解析器小巧轻便,解析速度快,简单易用
主动从解析器中获取事件,可以在满足了需要的条件后不再获取事件,结束解析
准备的待解析xml:
代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<weapons>
    <weapon material="玉" type="剑">
        <name>问天剑</name>
        <atk>2000</atk>
        <user>语熙华</user>
    </weapon>
    <weapon material="铁" type="刀">
        <name>皇刀</name>
        <atk>3000</atk>
        <user>九方玄玉</user>
    </weapon>
</weapons>
一、解析Xml:
代码语言:javascript
复制
private ArrayList<WeaponXml> parseXmlWithPull() {
    InputStream is = null;
    try {
        //XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        //XmlPullParser pullParser = factory.newPullParser();
        //获得Xml解析器--等价上两句
        XmlPullParser pullParser = Xml.newPullParser();
        //得到一个含有xml的is输入流
         is = getAssets().open("weapon.xml");
        //设置输入流
        pullParser.setInput(is, "utf-8");
        //触发第一个事件:eventType=0 即:START_DOCUMENT
        int eventType = pullParser.getEventType();
        //没有读到文档结束之前都在while里走
        while (eventType != XmlPullParser.END_DOCUMENT) {
            switch (eventType) {//根据事件类型执行
                case XmlPullParser.START_DOCUMENT://文档开始
                    //新建对象的集合
                    mWeapons = new ArrayList<>();
                    break;
                case XmlPullParser.START_TAG://读到第一个标签时再进行switch选择
                    switch (pullParser.getName()) {//拿到标签名称
                        case "weapon"://如果标签是weapon
                            //新建一个 Weapon对象用来记录信息
                            mWeapon = new WeaponXml();
                            //获取第一个属性值
                            String material = pullParser.getAttributeValue(0);
                            //获取第二个属性值
                            String type = pullParser.getAttributeValue(1);
                            //对象装载得到的属性
                            mWeapon.setType(type);
                            mWeapon.setMaterial(material);
                            break;
                        case "name":
                            //对于没有属性的标签,可以用nextText获取标签内部的文字
                            String name = pullParser.nextText();
                            mWeapon.setName(name);
                            break;
                        case "atk":
                            Short atk = new Short(pullParser.nextText());
                            mWeapon.setAtk(atk);
                            break;
                        case "user":
                            String user = pullParser.nextText();
                            mWeapon.setUser(user);
                            break;
                    }
                    break;
                case XmlPullParser.END_TAG://当事件类型是终止标签时:即</XXX>
                    if ("weapon".equals(pullParser.getName())) {
                        mWeapons.add(mWeapon);//将生成对象加入集合,一个
                    }
                    break;
            }
            eventType = pullParser.next();//解析下一元素,更新event
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        if (is != null) {
            try {
                is.close();//关流
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return mWeapons;
}
二、Xml的写入:
代码语言:javascript
复制
    /**
     * 备份Xml--当然也可以备份任意的实体类作为Xml,比如短信,联系人
     */
    private void backUpXml() {
        ArrayList<WeaponXml> weapons = parseXmlWithPull();
        XmlSerializer serializer = Xml.newSerializer();
        FileOutputStream fos = null;
        try {
            String path = Environment.getExternalStorageDirectory().getAbsolutePath();
             fos = new FileOutputStream(path + File.separator + "weapon.xml");

            serializer.setOutput(fos, "utf-8");
            //文档开始
            serializer.startDocument("utf-8", true);
            serializer.startTag("", "weapons");
            for (WeaponXml weapon : weapons) {
                //新建标签: <weapon>
                serializer.startTag(null, "weapon");
                //设置属性: material="玉" type="剑"

                serializer.attribute("","material", weapon.getMaterial());
                serializer.attribute("","type", weapon.getType());
                //嵌套子标签:<name>问天剑</name>
                serializer.startTag(null, "name");
                serializer.text(weapon.getName().trim());
                serializer.endTag(null, "name");

                serializer.startTag(null, "atk");
                serializer.text(weapon.getAtk() + "");
                serializer.endTag(null, "atk");

                serializer.startTag(null, "user");
                serializer.text(weapon.getUser().trim());
                serializer.endTag(null, "user");
                //终止标签: </weapon>
                serializer.endTag(null, "weapon");
            }
            serializer.endTag("", "weapons");//标签结束
            serializer.endDocument();//文档结束
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

后记、
1.声明:

[1]本文由张风捷特烈原创,转载请注明 [2]欢迎广大编程爱好者共同交流 [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正 [4]你的喜欢与支持将是我最大的动力

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.09.09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
    • Pull解析概述
      • 准备的待解析xml:
      • 一、解析Xml:
      • 二、Xml的写入:
      • 后记、
        • 1.声明:
        相关产品与服务
        短信
        腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档