首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

JDOM 實戰進階:XML 命名空間、ResultSetBuilder、XSLT 與 XPath 整合

     編輯:Java 程式設計入門

JDOM 實戰進階:命名空間、數據庫集成與 XML 轉換

繼上篇介紹 JDOM 核心類與基本操作後,本文深入講解 XML 命名空間處理、ResultSetBuilder 數據庫映射、XSLT 轉換與 XPath 查詢,展示 JDOM 在企業級 XML 處理中的強大能力。

1. 原生命名空間支持

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);

關鍵特性

  • 命名空間是類型一部分:元素移動時保持原命名空間,不會自動繼承父元素命名空間(語義結構優先於文本表現)。
  • XMLOutputter 智能處理:自動在恰當位置輸出 xmlns 聲明,避免冗餘。可用 element.addNamespaceDeclaration() 強制提前聲明(如全部聲明在根元素)。
  • 所有訪問器支持可選 namespace 參數:getChild(name, ns)、getAttribute(name, ns) 等,精確定位。

2. ResultSetBuilder:JDBC ResultSet 轉 XML

將數據庫查詢結果直接構建為 JDOM 文檔,無需手動遍歷:

ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
ResultSetBuilder builder = new ResultSetBuilder();
Document doc = builder.build(rs);  // 自動映射列名為元素名,行為子元素

// 輸出示例
// 
//   
//     1
//     John
//     IT
//   
//   ...
// 
  • 自動處理類型轉換、Null 值、大結果集流式構建。
  • 可自定義構建策略(繼承 ResultSetBuilder 重寫方法)。

3. XSLT 轉換整合

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。

4. XPath 查詢:JDOM + Jaxen

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 1.0 全功能:軸、謂語、函數、變量。
  • 命名空間上下文:xpath.addNamespace("xhtml", "https://www.w3.org/1999/xhtml")。

5. 完整示例:數據庫 → JDOM → XPath 篩選 → XSLT 輸出 HTML

// 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);

6. 最佳實踐總結

場景推薦方案
命名空間密集文檔JDOM 原生 Namespace 類 + XMLOutputter 自動聲明
數據庫結果集轉 XMLResultSetBuilder 一鍵構建
複雜 XML 轉換JDOMSource/JDOMResult 橋接 XSLT (TrAX)
結構化查詢/提取Jaxen XPath 引擎
大文檔流式處理SAXBuilder + 自定義 Handler 或 StAX

JDOM 以 Java 原生 API 設計、集合框架集成、靈活擴展性,成為 Java 平台上處理 XML 最富生產力的選擇之一。掌握上述進階特性,能讓你在數據集成、報表生成、Web Service、配置管理等場景中游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved