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


    零、前言

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

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

        /**
         * 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

        /**
         * 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]你的喜欢与支持将是我最大的动力

    2.连接传送门:

    更多安卓技术欢迎访问:安卓技术栈
    我的github地址:欢迎star
    简书首发,腾讯云+社区同步更新
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

    3.联系我

    QQ:1981462002
    邮箱:1981462002@qq.com
    微信:zdl1994328

    4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    [51nod1299]监狱逃离
    [51nod1206]Picture
    noi 2016 游记
    [Codeforces 696D] Legen...
    [bzoj2574] [Poi1999]Store-Keeper
    [bzoj1227] [SDOI2009]虔诚的墓主人
    [bzoj3979] [WF2012]infiltration
    Docker
    SpringBoot实现登录
    SpringBoot第一次案例
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781889.html
Copyright © 2020-2023  润新知