天天看点

android修改xml文档—DOM方式

需求说明:

在android中,使用xml配置文件替代原来的SharedPreferences,并且将文件放置到sd卡下,以实现软件的“绿色化”(项目是针对大屏开发的,所以有这样奇怪的需求)

相关知识储备:

先前只是解析过xml类型的接口数据,并且,一般情况下大家使用xml文件也多是作为只读文件来用。关于修改xml文件是一无所知的。

处理思路:

拿到要修改的节点名,如果存在则修改,如果不存在则添加

完整代码:

public void setXmlValue(String key, Object value) {
        Long st = System.currentTimeMillis();
//        String time = DateUtils.getCurrLongTime();
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //通过实例构建DocumentBuilder
            DocumentBuilder db = dbf.newDocumentBuilder();
            //创建Document    解析给定的文件
            Document doc = db.parse(new File(PATH));
            Element root = doc.getDocumentElement();
            String  vStr = value.toString();
            Text vt = doc.createTextNode(vStr);
            NodeList nodeList = root.getElementsByTagName(key);
            int len = nodeList.getLength();
            Log.e(TAG, "len = " + len);
            if (len > 0) {//说明已经存在了
//                for (int i = 0; i < len; i++) {
                Element element = (Element) nodeList.item(0);
                Log.e(TAG, "键名: " + element.getNodeName() + "|键值: " + element
                        .getFirstChild().getNodeValue() + "|传入值: " + vStr);
//                element.setNodeValue(value.toString());
                element.setTextContent(vStr);
//                element.getFirstChild().setNodeValue(vStr);
//                Log.e(TAG, "设置之后,value: " + element.getFirstChild().getNodeValue());
//                element.appendChild(vt);
                Log.e(TAG,"设置之后,value: "+element.getFirstChild().getNodeValue());
//                root.appendChild(element);//这句一定不能加,就是在这行代码上面浪费了好些时间
//                }
            } else {//说明不存在
                //添加一个元素
                Element eModel = doc.createElement(key);
                //在元素中添加文本
                Log.e(TAG, "else - - - " + eModel.getNodeName());
                eModel.appendChild(vt);
                root.appendChild(eModel);
            }

            //添加一个属性
            //Attr attr = doc.createAttribute("aaa");
            //创建工厂对象
            TransformerFactory tfs = TransformerFactory.newInstance();
            //创建Transformer对象
            Transformer tf = tfs.newTransformer();
            //将document输出到输出流中。
            tf.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(PATH)));
            Long hastime = System.currentTimeMillis() - st;
            Log.e(TAG, "DOM方式耗时:" + hastime);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }
           

特别说明:

由于我的项目里所有使用到的节点都是不会重名的,所以,代码里的判断直接通过nodeList的length来进行了。

心得:

①多写test②代码的逻辑流程要通顺

参考文章及链接:

《Android修改XML文件 - daishuguang》 http://www.tuicool.com/articles/ZBrEJr

《关于使用Element.getNodeValue()返回NULL的问题 》 http://blog.sina.com.cn/s/blog_5da93c8f0100t28h.html

《How do I append a node to an existing XML file in java》 http://stackoverflow.com/questions/6445828/how-do-i-append-a-node-to-an-existing-xml-file-in-java