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