上一篇文章我介紹了SAX方法解析XML文件的過程,這篇文章講解的內容是利用DOM方法修改XML文件的節點內容。
下面依然是首先貼出XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<EPClientDemo>
<WebService_IP>172.16.6.17</WebService_IP>
<WebService_PORT>8080</WebService_PORT>
<Dest>最高人民檢查院 </Dest>
<RootPath_Receive>E:\rec</RootPath_Receive>
<Receiver>測試 </Receiver>
</EPClientDemo>
我們可以看到這個文件非常簡單,只有一個根節點,所以我在代碼中就只是用到根節點,當然,如果遇到復雜的XML文件,解析方法是相同的,只需要指定某一層的父節點即可。
好了,不多說廢話了,直接貼出解析類,說明我在這裡就不寫了,代碼中都有
package com.brucezhang.xmltest;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
public class MyDom_Update {
/**
* @param index 修改值的標簽索引
* @param count 修改的是第幾個值
* @param value 修改的目標值
* @param outOrno 是否輸出XML文件內容
*
* @author DLUTBruceZhang
* */
public void update(String index, int count, String value, boolean outOrno) {
Document document = null;
try {
document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse("my_xml.xml");
Element root = document.getDocumentElement();
root.getElementsByTagName(index).item(count).setTextContent(value);
output(root, "my_xml.xml");
if (outOrno) {
System.out.println("-------------------------使用DOM方法輸出-------------------------");
output(root, null);
}
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//寫回XML文件,保存修改或打印到控制台
public static void output(Node node, String filename) {
TransformerFactory transFactory = TransformerFactory.newInstance();
try {
Transformer transformer = transFactory.newTransformer();
// 設置各種輸出屬性
transformer.setOutputProperty("encoding", "gb2312");
transformer.setOutputProperty("indent", "yes");
DOMSource source = new DOMSource();
// 將待轉換輸出節點賦值給DOM源模型的持有者(holder)
source.setNode(node);
StreamResult result = new StreamResult();
if (filename == null) {
// 設置標准輸出流為transformer的底層輸出目標
result.setOutputStream(System.out);
} else {
result.setOutputStream(new FileOutputStream(filename));
}
// 執行轉換從源模型到控制台輸出流
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
相關系列閱讀: