JDOM 是一個純 Java 的 XML 解析庫,API 直觀、記憶體效率較 DOM 佳,適合中小型 XML 文件處理。下面示範如何解析 XML 字串並提取巢狀元素資料。
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6</version>
</dependency>
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.Namespace;
import org.jdom2.input.SAXBuilder;
import org.xml.sax.InputSource;
import java.io.StringReader;
import java.util.List;
public class JDomXmlParser {
public void parseXmlString(String xmlContent) {
try {
// 1. 建立 SAXBuilder 並解析字串
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new InputSource(new StringReader(xmlContent)));
// 2. 取得根元素
Element root = doc.getRootElement();
System.out.println("根元素: " + root.getName());
// 3. 處理命名空間(若 XML 有 xmlns)
Namespace ns = root.getNamespace();
// 4. 遍歷第一層子元素
List<Element> rows = root.getChildren();
for (Element row : rows) {
// 取得帶命名空間的子元素文字
String userId = row.getChildText("users_id", ns);
String address = row.getChildText("users_address", ns);
System.out.println("ID: " + userId + ", 地址: " + address);
}
// 5. 進一步遍歷第二層(若有)
if (!rows.isEmpty()) {
Element firstRow = rows.get(0);
List<Element> subNodes = firstRow.getChildren();
for (Element sub : subNodes) {
System.out.println("子節點名稱: " + sub.getName());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String xml = "\n" +
"<Result xmlns=\"https://www.fiorano.com/fesb/activity/DBQueryOnInput2/Out\">\n" +
" <row resultcount=\"1\">\n" +
" <users_id>1001</users_id>\n" +
" <users_name>wangwei</users_name>\n" +
" <users_group>80</users_group>\n" +
" <users_address>1001號</users_address>\n" +
" </row>\n" +
" <row resultcount=\"1\">\n" +
" <users_id>1002</users_id>\n" +
" <users_name>wangwei</users_name>\n" +
" <users_group>80</users_group>\n" +
" <users_address>1002號</users_address>\n" +
" </row>\n" +
"</Result>";
new JDomXmlParser().parseXmlString(xml);
}
}
xmlns 時,子元素隸屬該命名空間,getChildText(name, ns) 必須傳入 Namespace 物件,否則取不到值。getChildren():取得所有直接子元素(List<Element>)getChildText(name, ns):直接取得子元素文字內容,自動處理 nullgetAttributeValue(name):取得屬性值根元素: Result
ID: 1001, 地址: 1001號
ID: 1002, 地址: 1002號
子節點名稱: users_id
子節點名稱: users_name
子節點名稱: users_group
子節點名稱: users_address
JDOM 的流暢 API 讓 XML 解析代碼極具可讀性,若專案需處理大型 XML 或高效能串流場景,可考慮 StAX (XMLStreamReader) 或 SAX 原生 API。