DOM4J 是 Java 操作 XML 的優秀庫,API 直觀、支援 XPath、效能優異。Maven 依賴:
org.dom4j dom4j 2.1.4
張三 20 134222223333 zhangsan@qq.com 432221111 李四 20 134222225555 lisi@qq.com 432222222 王五 32 465431341 af@qq.com 46164694 測試 其他用途
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class Dom4jDemo {
public static void main(String[] args) throws DocumentException {
// 1. 讀取文檔
SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/contact.xml"));
// 2. 獲取根元素
Element root = document.getRootElement();
System.out.println("根節點:" + root.getName()); // contactList
// 3. 獲取直接子元素(非遞歸)
List children = root.elements();
for (Element e : children) {
System.out.println("一級子節點:" + e.getName());
}
// 4. 獲取指定名稱的子元素(第一個)
Element contactElem = root.element("contact");
System.out.println("第一個 contact 子節點:" + contactElem.getName());
// 5. 獲取指定元素的所有子元素
List contactChildren = contactElem.elements();
for (Element e : contactChildren) {
System.out.println("contact 子節點:" + e.getName());
}
// 6. 遞歸遍歷所有節點(含文本、屬性等)
System.out.println("\n=== 遞歸遍歷 ===");
printTree(root, 0);
// 7. 多層級路徑獲取
Element nameElem = root.element("contact").element("name");
System.out.println("\n深層節點:" + nameElem.getName() + " = " + nameElem.getText());
}
private static void printTree(Element element, int level) {
String indent = " ".repeat(level);
System.out.println(indent + "元素:" + element.getQualifiedName());
// 處理屬性
for (Attribute attr : element.attributes()) {
System.out.println(indent + " 屬性:" + attr.getName() + "=" + attr.getValue());
}
// 處理文本內容
String text = element.getTextTrim();
if (!text.isEmpty()) {
System.out.println(indent + " 文本:" + text);
}
// 遞歸子元素
for (Element child : element.elements()) {
printTree(child, level + 1);
}
}
}
List nodes = document.selectNodes("//contact[@id='001']/name"); NamespaceContext 配合 XPath。XMLWriter writer = new XMLWriter(new FileWriter("out.xml")); writer.write(document);ElementHandler 避免全量載入記憶體。| 問題 | 解決 |
|---|---|
| 中文亂碼 | 確保 XML 聲明 encoding、讀寫時指定 UTF-8 |
| 元素名稱大小寫敏感 | XML 區分大小寫,代碼中需完全匹配 |
| 預設命名空間導致 XPath 無結果 | 註冊命名空間前綴後再查詢 |