核心代碼實現
import org.dom4j.*;
import org.dom4j.io.*;
import java.io.File;
import java.util.Map;
public class XmlUpdater {
public void updateXml(String filePath, Map dataMap) throws Exception {
// 1. 解析 XML
SAXReader reader = new SAXReader();
Document document = reader.read(new File(filePath));
// 2. 定位掛載點:獲取根元素最後一個子節點
Element root = document.getRootElement();
Element targetParent = root.elements().get(root.elements().size() - 1);
// 3. 創建新節點結構
Element products = DocumentHelper.createElement("products");
for (Map.Entry entry : dataMap.entrySet()) {
Element product = DocumentHelper.createElement("product");
product.addAttribute("name", entry.getKey());
product.addAttribute("value", entry.getValue());
products.add(product);
}
// 4. 掛載到目標父節點
targetParent.add(products);
// 5. 格式化寫回文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
format.setIndent(" "); // 4 空格縮進
XMLWriter writer = new XMLWriter(new FileOutputStream(filePath), format);
writer.write(document);
writer.close();
}
}
關鍵 API 解析
| 類/方法 | 用途 |
| SAXReader.read() | 解析 XML 文件生成 Document 對象 |
| DocumentHelper.createElement() | 創建獨立元素(不依賴 Document) |
| Element.addAttribute() | 添加屬性(自動處理轉義) |
| Element.add(Element) | 添加子元素 |
| OutputFormat.createPrettyPrint() | 創建帶縮進換行的輸出格式 |
| XMLWriter | 將 Document 寫入流/文件 |
原始碼註釋版(JDK 原生 DOM)
/*
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("src/ProdQuery.xml"));
Element products = doc.createElement("products");
Node lastChild = doc.getChildNodes().item(doc.getChildNodes().getLength() - 1);
for (String key : map.keySet()) {
Element product = doc.createElement("product");
Attr nameAttr = doc.createAttribute("name");
nameAttr.setNodeValue(key);
Attr valueAttr = doc.createAttribute("value");
valueAttr.setNodeValue(map.get(key));
product.setAttributeNode(nameAttr);
product.setAttributeNode(valueAttr);
products.appendChild(product);
}
lastChild.appendChild(products);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{https://xml.apache.org/xslt}indent-amount", "4");
transformer.transform(new DOMSource(doc), new StreamResult(new File("src/ProdQuery.xml")));
*/
DOM4J vs 原生 DOM 選擇建議
- DOM4J/JDOM2:API 友好、XPath 支持、性能較好、推薦新項目
- 原生 DOM:無第三方依賴、JDK 內置、標準化、舊項目維護
- 大文件:使用 SAX/StAX 流式處理,避免全量載入內存