dom4j 是 Java 平台上一款簡單易用的 XML 處理工具,基於 Java Collections 架構,完整支援 DOM、SAX、JAXP 標準。它以靈活的 API 和優異的性能,成為 Java 開發者處理 XML 的首選庫之一。
使用 DocumentHelper 快速構建文檔結構,通過鏈式調用添加元素、屬性及文本內容:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
public class Users {
public Document createDocument() {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("users");
root.addElement("user")
.addAttribute("userid", "sucode")
.addAttribute("username", "Eric Yu")
.addText("myself");
root.addElement("user")
.addAttribute("userid", "scottl")
.addAttribute("username", "Scott Long")
.addText("FreeBSD leader");
return document;
}
}
生成的 XML 結構:
<users>
<user userid="sucode" username="Eric Yu">myself</user>
<user userid="scottl" username="Scott Long">FreeBSD leader</user>
</users>
得益於 Node 接口的 asXML() 方法,文檔、元素、屬性均可輕鬆轉為 XML 字符串;反向解析同樣簡單:
Document document = (new Users()).createDocument();
String text = document.asXML(); // 文檔轉字符串
Document doc = DocumentHelper.parseText(text); // 字符串轉文檔
針對大文檔,避免頻繁創建 Iterator 開銷,推薦使用索引ベース的快速遍歷:
public void treeWalk(Document document) {
treeWalk(document.getRootElement());
}
public void treeWalk(Element element) {
for (int i = 0, size = element.nodeCount(); i < size; i++) {
Node node = element.node(i);
if (node instanceof Element) {
treeWalk((Element) node);
} else {
// 業務邏輯處理
}
}
}
dom4j 支援在文檔或任意節點上執行 XPath 表達式:
// 獲取所有 user 節點
List userlist = document.selectNodes("//users/user");
// 獲取 userid 為 sucode 的唯一節點
Element user = (Element) document.selectSingleNode("//users/user[@userid='sucode']");
selectSingleNode 返回首個匹配節點,後續匹配會被忽略。
dom4j 提供直觀的寫入方式,並可通過 XMLWriter 指定格式化輸出:
FileWriter out = new FileWriter("users.xml");
document.write(out);
// 或者使用 XMLWriter 實現漂亮打印
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
XMLWriter writer = new XMLWriter(new FileWriter("users.xml"),
OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();