JDOM 是一個開源的 Java XML 處理庫,基於樹形結構,純 Java 實現,專為 Java 開發者設計。它結合了 SAX(事件驅動、低內存)與 DOM(樹形、易操作)的優點,利用 Java 集合框架與方法重載特性,提供直觀、邏輯清晰的 API,大幅簡化 XML 文檔的解析、生成、序列化與操作。
List、Iterator 等集合接口,代碼風格與 Java 標準庫一致。| 包名 | 功能說明 |
|---|---|
| org.jdom | 核心類:Document、Element、Attribute、Text 等 |
| org.jdom.input | 輸入構建器:SAXBuilder、DOMBuilder、StAXBuilder |
| org.jdom.output | 輸出工具:XMLOutputter(格式化輸出至流/文件) |
| org.jdom.filter | 過濾器:ElementFilter、ContentFilter 等 |
| org.jdom.transform | 轉換器:JDOMResult、JDOMSource(與 XSLT/StAX 互操作) |
| org.jdom.adapters | 適配器:橋接第三方 DOM 實現(如 Xerces、Crimson) |
jdom-2.x.x.jar 與 jdom-2.x.x-javadoc.jar(官網:jdom.org)lib 目錄並加入構建路徑
people.xml)package com.book.jdom;
import java.io.FileOutputStream;
import java.io.IOException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;
public class CreateJdom {
public static void main(String[] args) {
// 1. 構建元素樹
Element root = new Element("people");
Element student = new Element("student");
student.setAttribute("name", "張三");
student.setAttribute("salary", "8000");
student.setText("呵呵");
root.addContent(student);
// 2. 創建文檔對象
Document doc = new Document(root);
// 3. 配置輸出格式
Format format = Format.getCompactFormat();
format.setEncoding("UTF-8");
format.setIndent(" "); // 4 空格縮進
// 4. 輸出到文件
XMLOutputter xmlout = new XMLOutputter(format);
try (FileOutputStream fos = new FileOutputStream("people.xml")) {
xmlout.output(doc, fos);
System.out.println("成功!生成文件:people.xml");
} catch (IOException e) {
e.printStackTrace();
}
}
}
運行結果:
<?xml version="1.0" encoding="UTF-8"?>
<people>
<student name="張三" salary="8000">呵呵</student>
</people>
package com.book.jdom;
import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
public class Readxml {
public static void main(String[] args) {
SAXBuilder sax = new SAXBuilder();
try {
Document doc = sax.build("people.xml");
Element root = doc.getRootElement();
List<Element> students = root.getChildren("student");
for (Element stu : students) {
System.out.println("name:" + stu.getAttributeValue("name")
+ " salary:" + stu.getAttributeValue("salary"));
System.out.println("text:" + stu.getText());
}
} catch (JDOMException | IOException e) {
e.printStackTrace();
}
}
}
運行結果:
name:張三 salary:8000 text:呵呵
針對包含多層巢狀 <Key> 與 <Value> 的配置型 XML,展示多層遍歷與條件提取技巧:
package input;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class ReadXML {
public static void main(String[] args) throws JDOMException, IOException {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(ReadXML.class.getClassLoader()
.getResourceAsStream("nation.xml"));
Element root = doc.getRootElement();
// 獲取所有頂層 Key 元素
List<Element> keys = root.getChildren("Key");
for (Element key : keys) {
String country = key.getAttributeValue("Name");
System.out.print(country);
// 1. 直接子 Value:提取 PhotoIDWidth
List<Element> values = key.getChildren("Value");
for (Element v : values) {
if ("PhotoIDWidth".equals(v.getAttributeValue("Name"))) {
System.out.print("<--------->" + v.getAttributeValue("Name")
+ "," + v.getText());
}
}
// 2. 巢狀 Key -> Child -> HeadPercent
List<Element> subKeys = key.getChildren("Key");
for (Element sk : subKeys) {
if ("Child".equals(sk.getAttributeValue("Name"))) {
List<Element> childValues = sk.getChildren("Value");
for (Element cv : childValues) {
if ("HeadPercent".equals(cv.getAttributeValue("Name"))) {
System.out.println("<--------->" + cv.getText());
}
}
}
}
}
}
}
輸出結果:
China<--------->PhotoIDWidth,38PhotoIDWidth<--------->0.60ChildHeadPercent Australia<--------->PhotoIDWidth,35PhotoIDWidth<--------->0.711ChildHeadPercent Austria<--------->PhotoIDWidth,35PhotoIDWidth<--------->0.689ChildHeadPercent

JDOM 以其「純 Java、API 直觀、內存效率高」的特點,成為 Java 處理中小型 XML 文檔的優選方案。本文涵蓋了從環境搭建、基本增刪改查到複雜巢狀結構解析的完整實戰,讀者可直接套用代碼模板至實際項目中。對於大型 XML(超過百 MB),建議改用 SAX 或 StAX 流式解析以避免 OOM 風險。