JDOM 是 Java 專用的 XML 文檔操作 API,提供比 DOM 更簡潔、比 SAX 更靈活的樹模型操作體驗。本文演示如何使用 JDOM 讀取、修改、輸出 XML 文件,含完整代碼與前後對比截圖說明。
依賴引入
org.jdom
jdom2
2.0.6
原始 XML (sample.xml)
John
30
IT
Jane
25
HR
Java 修改代碼
import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
import java.io.FileOutputStream;
import java.util.List;
public class JDomUpdateDemo {
public static void main(String[] args) throws Exception {
// 1. 解析 XML 為 Document 物件
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build("sample.xml");
Element root = doc.getRootElement();
// 2. 修改:將 id=1 的員工年齡改為 31,部門改為 R&D
List employees = root.getChildren("employee");
for (Element emp : employees) {
if ("1".equals(emp.getAttributeValue("id"))) {
emp.getChild("age").setText("31");
emp.getChild("department").setText("R&D");
// 新增技能元素
Element skill = new Element("skill");
skill.setText("Java");
emp.addContent(skill);
break;
}
}
// 3. 新增員工
Element newEmp = new Element("employee");
newEmp.setAttribute("id", "3");
newEmp.addContent(new Element("name").setText("Bob"));
newEmp.addContent(new Element("age").setText("28"));
newEmp.addContent(new Element("department").setText("Finance"));
root.addContent(newEmp);
// 4. 刪除 id=2 的員工
Element toRemove = null;
for (Element emp : root.getChildren("employee")) {
if ("2".equals(emp.getAttributeValue("id"))) {
toRemove = emp;
break;
}
}
if (toRemove != null) toRemove.detach();
// 5. 格式化輸出回文件
XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
outputter.output(doc, new FileOutputStream("sample_modified.xml"));
System.out.println("XML 更新完成");
}
}
修改後 XML (sample_modified.xml)
John
31
R&D
Java
Bob
28
Finance
關鍵 API 對照表
| 操作 | JDOM 方法 |
| 解析文件 | SAXBuilder.build(File/InputStream/String) |
| 獲取根元素 | doc.getRootElement() |
| 查找子元素 | element.getChild(name) / getChildren(name) |
| 獲取屬性值 | element.getAttributeValue(name) |
| 修改文本 | element.setText(String) |
| 新增子元素 | parent.addContent(Element) |
| 新增屬性 | element.setAttribute(name, value) |
| 刪除元素 | element.detach() |
| 格式化輸出 | XMLOutputter(Format.getPrettyFormat()) |
JDOM vs DOM vs JAXB 快速選型
| 場景 | 推薦 | 理由 |
| 簡單修改、配置文件 | JDOM | API 直觀、依賴輕、無需註解 |
| 大文件、流式處理 | StAX/SAX | 低記憶體、單向流 |
| 物件⇄XML 雙向綁定 | JAXB | 註解驅動、領域模型映射 |
| 標準合規、企業級 | DOM (W3C) | 標準 API、跨語言可移植 |
常見坑點
- 命名空間:
getChild("name", namespace) 需顯式傳入 Namespace 物件。
- 編碼:輸出時指定
Format.getPrettyFormat().setEncoding("UTF-8")。
- 實體引用:JDOM 預設不展開實體,需
builder.setExpandEntities(true)。
- 執行緒安全:Document 非線程安全,多執行緒環境下需同步或複製。
- 上一篇文章: 變數命名精準化指南:消除歧義、布林語義、符合預期三大原則
- 下一篇文章: Java 記憶體洩漏解決方案(三):SoftHashMap 源碼深度解析與 Reference 機制實戰</x2ID>
<xTitle>Java 記憶體洩漏解決方案(三):SoftHashMap 源碼深度解析與 Reference 機制實戰
Copyright ©
程式碼之家 All Rights Reserved