天天看點

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