需求說明:
在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