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

4-SIII-Android数据固化之Xml的Dom解析和存储

作者头像
张风捷特烈
发布2018-09-29 11:23:43
6980
发布2018-09-29 11:23:43
举报
文章被收录于专栏:Android知识点总结
零、前言

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

DOM解析概述:
代码语言:javascript
复制
DOM将整个XML文件加载到内存中,并构建出节点树;
应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点、属性等信息;
优点:对XML节点的添加修改等,而且解析也很方便
缺点比较耗费内存,解析速度也不快
准备的待解析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>

一、dom解析Xml
代码语言:javascript
复制
    /**
     * dom解析Xml
     * @return
     */
    private ArrayList<WeaponXml> parseXmlWithDom() {
         mWeapons = new ArrayList<>();
        InputStream is = null;

        try {
            is = getAssets().open("weapon.xml");
            //获取document对象
            Document dom = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(is);
            //获取根元素
            Element root = dom.getDocumentElement();
            //获取weapon节点
            NodeList weaponNode = root.getElementsByTagName("weapon");
            for (int i = 0; i < weaponNode.getLength(); i++) {
                mWeapon = new WeaponXml();
                //获取person下第i个元素
                Element weaponEl = (Element) weaponNode.item(i);
                String material = weaponEl.getAttribute("material");//得到第i个属性值
                String type = weaponEl.getAttribute("type");//得到第i个属性值

                mWeapon.setMaterial(material);
                mWeapon.setType(type);

                NodeList childNodes = weaponEl.getChildNodes();//获得获取weapon下子元素

                for (int j = 0; j < childNodes.getLength(); j++) {

                    if (childNodes.item(j).getNodeType() == Node.ELEMENT_NODE) {
                        String nodeName = childNodes.item(j).getNodeName();
                        if ("name".equals(nodeName)) {
                            String name = childNodes.item(j).getFirstChild().getNodeValue();
                            mWeapon.setName(name);
                        } else if ("atk".equals(nodeName)) {
                            String atk = childNodes.item(j).getFirstChild().getNodeValue();
                            mWeapon.setAtk(Integer.parseInt(atk));
                        } else if ("user".equals(nodeName)) {
                            String user = childNodes.item(j).getFirstChild().getNodeValue();
                            mWeapon.setUser(user);
                        }
                    }
                }
                mWeapons.add(mWeapon);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mWeapons;
    }

二、dom存储Xml
代码语言:javascript
复制
    /**
     * sax创建Xml文件
     */
    private void domCreateXml() {
        try {
            ArrayList<WeaponXml> weaponXmls = parseXmlWithDom();

            //创建Dom解析器
            DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

            //新建空白文档
            Document doc = builder.newDocument();
            //建立根元素employees
            Element root = doc.createElement("weapons");
            //将根节点添加进入文档
            doc.appendChild(root);

            for (WeaponXml weaponXml : weaponXmls) {
                Element weapon = doc.createElement("weapon");
                weapon.setAttribute("material", weaponXml.getMaterial());
                weapon.setAttribute("type", weaponXml.getType());
                root.appendChild(weapon);

                Element name = doc.createElement("name");
                name.appendChild(doc.createTextNode(weaponXml.getName()));
                weapon.appendChild(name);


                Element atk = doc.createElement("atk");
                atk.appendChild(doc.createTextNode(weaponXml.getAtk()+""));
                weapon.appendChild(atk);

                Element user = doc.createElement("user");
                user.appendChild(doc.createTextNode(weaponXml.getUser()));
                weapon.appendChild(user);
            }

            //为了得到xslt引擎创建对象
            TransformerFactory tff = TransformerFactory.newInstance();
            //创建xslt引擎对象输出xml文档
            Transformer tf = tff.newTransformer();
            //获取属性对象
            Properties pro = tf.getOutputProperties();
            //设置编码格式和输出格式
            pro.setProperty(OutputKeys.ENCODING, "utf-8");
            pro.setProperty(OutputKeys.METHOD, "xml");
            tf.setOutputProperties(pro);
            //创建资源对象
            DOMSource source = new DOMSource(doc);
            String path = Environment.getExternalStorageDirectory().getAbsolutePath()
                    +File.separator+"WeaponDom.xml";
            //获得输出对象
            StreamResult result = new StreamResult(new File(path));
            //执行dom文档到xml文件转换
            tf.transform(source, result);
        } catch (Exception e) {
            e.printStackTrace();
        }

后记、
1.声明:

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

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 零、前言
    • DOM解析概述:
      • 准备的待解析xml:
      • 一、dom解析Xml
      • 二、dom存储Xml
      • 后记、
        • 1.声明:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档