首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java DOM4J/XML 節點動態更新:創建元素、屬性操作、格式化輸出完整示例

     編輯:Java 綜合教學

核心代碼實現

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 流式處理,避免全量載入內存
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved