Java 與 XML 結合已成主流,但標準 API(DOM、SAX、JAXP)或因語言中立導致 Java 使用繁瑣、或因介面驅動增加工廠模式複雜度。JDOM 由 Brett McLaughlin 與 Jason Hunter 創建,專為 Java 設計:使用原生 String、Collections API、類驅動而非介面驅動、無 Node 階層強制轉型。它不取代解析器,建立在現有 API 之上,提供「更好的捕鼠器」。
以汽車 XML 為例:
<?xml version="1.0" encoding="UTF-8"?>
<car vin="123fhg5869705iop90">
<!--Description of a car-->
<make>Toyota</make>
<model>Celica</model>
<year>1997</year>
<color>green</color>
<license state="CA">1ABC234</license>
</car>
Element carElement = new Element("car");
Document myDocument = new Document(carElement);
XML 單一根元素要求,故 Document 建構子接收根 Element。
carElement.addAttribute(new Attribute("vin", "123fhg5869705iop90"));
carElement.addContent(new Element("make").addContent("Toyota"));
carElement.addContent(new Element("model").addContent("Celica"));
carElement.addContent(new Element("year").addContent("1997"));
carElement.addContent(new Element("color").addContent("green"));
carElement.addContent(new Element("license").addContent("1ABC234").addAttribute("state", "CA"));
carElement.addContent(new Comment("Description of a car"));
addContent 回傳 Element 本身,支援鏈式寫法。Comment、CDATA 等標準 XML 型別同理。
Element yearElement = carElement.getChild("year"); // 回傳 Element,無需轉型
boolean removed = carElement.removeChild("year"); // 僅移除該元素
XMLOutputter outputter = new XMLOutputter(" ", true); // 兩空格縮排、換行
outputter.output(myDocument, System.out); // 輸出至 Writer/OutputStream
// 檔案輸出
FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();
JDOM 可輸出為 SAX 事件流、DOM Document、字串,亦可從 SAXBuilder/DOMBuilder 讀取現有 XML。這使 JDOM 能融入既有系統,或搭配僅支援特定模型的工具(如 Xalan XSLT)。
TransformerFactory tFactory = TransformerFactory.newInstance();
DOMOutputter domOutputter = new DOMOutputter();
org.w3c.dom.Document domDocument = domOutputter.output(myDocument);
Source xmlSource = new DOMSource(domDocument);
StreamSource xsltSource = new StreamSource(new FileInputStream("/some/directory/car.xsl"));
StreamResult xmlResult = new StreamResult(response.getOutputStream());
Transformer transformer = tFactory.newTransformer(xsltSource);
transformer.transform(xmlSource, xmlResult);
同樣輸出可透過 XMLOutputter 產生字串後轉 StreamSource 達成。JDOM 的多模型輸出能力(String、SAX、DOM)極大擴展了工具鏈相容性。
SAXBuilder builder = new SAXBuilder();
Document anotherDocument = builder.build(new File("/some/directory/sample.xml"));
解析後的 Document 可用前述方式操作。contrib 套件更提供 JDBC ResultSet 建構器、XPath 實作等擴展。
文章撰寫時 JDOM 處於 Beta 6,API 大多穩定,部分語義仍可能調整。核心重心在穩定 API、效能評估、支援 DTD 實體、XPath 核心整合與更多資料源整合。對於「用 Java 思維寫 XML」的開發者,JDOM 提供最平滑的學習曲線與最高開發效率。