繼上篇介紹 JDOM 核心類與基本操作後,本文深入講解 XML 命名空間處理、ResultSetBuilder 數據庫映射、XSLT 轉換與 XPath 查詢,展示 JDOM 在企業級 XML 處理中的強大能力。
JDOM 設計於命名空間規範發布之後,無歷史包袱,提供 Namespace 類一級支持:
// 創建命名空間
Namespace xhtml = Namespace.getNamespace("xhtml", "https://www.w3.org/1999/xhtml");
// 元素綁定命名空間
Element table = new Element("table", xhtml);
root.addContent(table);
// 獲取帶命名空間的子元素/屬性
Element body = root.getChild("body", xhtml);
Attribute lang = root.getAttribute("lang", xhtml);
xmlns 聲明,避免冗餘。可用 element.addNamespaceDeclaration() 強制提前聲明(如全部聲明在根元素)。getChild(name, ns)、getAttribute(name, ns) 等,精確定位。將數據庫查詢結果直接構建為 JDOM 文檔,無需手動遍歷:
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
ResultSetBuilder builder = new ResultSetBuilder();
Document doc = builder.build(rs); // 自動映射列名為元素名,行為子元素
// 輸出示例
//
//
// 1
// John
// IT
//
// ...
//
ResultSetBuilder 重寫方法)。JDOM 文檔可直接作為 XSLT 處理源,無需轉為 DOM:
// 加載樣式表
Document xsltDoc = new SAXBuilder().build("transform.xsl");
// 創建 Transformer
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer(new JDOMSource(xsltDoc));
// 執行轉換
Document sourceDoc = ...; // JDOM 文檔
JDOMResult result = new JDOMResult();
transformer.transform(new JDOMSource(sourceDoc), result);
Document outputDoc = result.getDocument();
JDOMSource/JDOMResult 實現 javax.xml.transform.Source/Result 接口,零拷貝橋接 JDOM 與 TrAX API。
JDOM 本身不包含 XPath 引擎,推薦集成 Jaxen(通用 XPath 引擎,支持 JDOM、DOM、XOM、dom4j):
// 添加依賴:jaxen.jar
XPath xpath = XPath.newInstance("//employee[@dept='IT']/name");
List results = xpath.selectNodes(document);
// 或編譯複用
XPath expr = XPath.newInstance("sum(//salary)");
Double total = (Double) expr.evaluate(document);
xpath.addNamespace("xhtml", "https://www.w3.org/1999/xhtml")。// 1. 查詢構建文檔
Document doc = new ResultSetBuilder().build(conn.createStatement().executeQuery("SELECT * FROM books"));
// 2. XPath 篩選 2020 年後出版的書
XPath xpath = XPath.newInstance("//row[year > 2020]");
List recent = xpath.selectNodes(doc);
// 3. 構建新文檔供 XSLT
Element newRoot = new Element("recent-books");
recent.forEach(row -> newRoot.addContent((Element) row.detach()));
Document recentDoc = new Document(newRoot);
// 4. XSLT 輸出 HTML 表格
Transformer transformer = TransformerFactory.newInstance()
.newTransformer(new JDOMSource(new SAXBuilder().build("books.xsl")));
JDOMResult result = new JDOMResult();
transformer.transform(new JDOMSource(recentDoc), result);
// 5. 序列化輸出
new XMLOutputter(Format.getPrettyFormat()).output(result.getDocument(), System.out);
| 場景 | 推薦方案 |
|---|---|
| 命名空間密集文檔 | JDOM 原生 Namespace 類 + XMLOutputter 自動聲明 |
| 數據庫結果集轉 XML | ResultSetBuilder 一鍵構建 |
| 複雜 XML 轉換 | JDOMSource/JDOMResult 橋接 XSLT (TrAX) |
| 結構化查詢/提取 | Jaxen XPath 引擎 |
| 大文檔流式處理 | SAXBuilder + 自定義 Handler 或 StAX |
JDOM 以 Java 原生 API 設計、集合框架集成、靈活擴展性,成為 Java 平台上處理 XML 最富生產力的選擇之一。掌握上述進階特性,能讓你在數據集成、報表生成、Web Service、配置管理等場景中游刃有餘。