DOM4J 是 Java 操作 XML 的經典庫,API 直觀、支持 XPath、性能優異。本文通過完整示例演示如何從零構建 XML 文檔並寫入文件,涵蓋元素創建、屬性設置、文本內容、格式化輸出等核心操作。
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version> <!-- 或 1.6.1 舊版本 -->
</dependency>
import java.io.File;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
public class DOM4JWriteDemo {
public static void main(String[] args) {
// 1. 創建文檔對象
Document document = DocumentHelper.createDocument();
// 2. 創建根元素
Element bookStore = document.addElement("bookstore");
// 3. 創建子元素並設置屬性
Element book = bookStore.addElement("book");
book.addAttribute("id", "001"); // 屬性
// 4. 添加子元素與文本內容
Element name = book.addElement("name");
name.addText("明朝那些事"); // 文本節點
Element price = book.addElement("price");
price.setText("100元"); // 等同 addText
Element type = book.addElement("type");
type.setText("歷史");
Element author = book.addElement("author");
author.setText("安格");
// 5. 格式化輸出設置(縮進、換行、編碼)
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); // 關鍵:防止中文亂碼
// 6. 寫入文件
try (FileOutputStream fos = new FileOutputStream(new File("books.xml"));
XMLWriter writer = new XMLWriter(fos, format)) {
writer.write(document);
System.out.println("XML 生成成功:books.xml");
} catch (Exception e) {
e.printStackTrace();
}
}
}
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="001">
<name>明朝那些事</name>
<price>100元</price>
<type>歷史</type>
<author>安格</author>
</book>
</bookstore>
| 任務 | 方法 | 說明 |
|---|---|---|
| 創建文檔 | DocumentHelper.createDocument() | 工廠方法 |
| 添加根元素 | doc.addElement("root") | 返回 Element |
| 添加子元素 | parent.addElement("child") | 鏈式調用 |
| 設置屬性 | element.addAttribute("key", "val") | |
| 設置文本 | element.setText("text") / addText() | setText 會清空原有內容 |
| 格式化輸出 | OutputFormat.createPrettyPrint() | 自動縮進換行 |
| 指定編碼 | format.setEncoding("UTF-8") | 必須設置,否則中文亂碼 |
| 寫入流 | new XMLWriter(outputStream, format) | 實現 AutoCloseable |
format.setEncoding("UTF-8"),否則中文會變成亂碼或實體引用。XMLWriter 與輸出流,防止文件鎖定或內容未刷新。< > & 轉義為實體,無需手動處理。XMLWriter 的流式寫入模式或 StAX,避免 DOM 佔用過多內存。DocumentHelper.createDocument(QName) 與 element.addElement(QName)。import java.io.StringWriter;
// ...
StringWriter sw = new StringWriter();
XMLWriter writer = new XMLWriter(sw, format);
writer.write(document);
String xmlString = sw.toString();