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

Java 解析 XML 實戰(一):JDOM 核心 API 與代碼示例

     編輯:Java 相關知識

前言:JDOM 定位

  • **純 Java 實現**,無原生依賴,部署簡單
  • **API 直觀**:new Element()、setContent()、getChild() 符合 Java 習慣
  • **性能短板**:10MB 文檔測試出現 OOM,不適合大文件
  • **現狀**:1.1 版本後更新緩慢,新項目建議優先 DOM4J/StAX/JAXB

官網:jdom.org

一、核心類速覽

類包職責
Documentorg.jdom文檔根,持有根元素
Elementorg.jdom元素節點,屬性/子元素/文本
SAXBuilderorg.jdom.inputSAX 解析器,構建 Document
XMLOutputterorg.jdom.outputDocument 輸出,支持格式化
Formatorg.jdom.output輸出格式:getPrettyFormat()、getCompactFormat()

二、完整示例:創建、寫入、讀取、輸出

import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.output.*;

public class DOMCreator {
    public static void main(String[] args) throws Exception {
        // 1. 創建文檔結構
        Document doc = new Document(new Element("Table"));
        Element row = new Element("Row");
        Element item = new Element("Item");
        item.setText("data");
        row.setContent(item);
        doc.getRootElement().setContent(row);

        // 2. 格式化寫入文件
        Format format = Format.getPrettyFormat();
        XMLOutputter outputter = new XMLOutputter(format);
        outputter.output(doc, new FileWriter("sample.xml"));

        // 3. 讀取並輸出到控制台
        SAXBuilder builder = new SAXBuilder();
        Document loaded = builder.build(new File("sample.xml"));
        new XMLOutputter().output(loaded, System.out);
    }
}

三、關鍵 API 差異對比 (vs DOM4J)

操作JDOMDOM4J
創建文檔new Document(rootElement)DocumentHelper.createDocument() + addElement()
創建元素new Element(name)parent.addElement(name) (工廠模式)
設置文本element.setText(text)element.addText(text)
設置子內容parent.setContent(child)parent.add(child) / parent.addElement()
獲取根元素doc.getRootElement()同
格式化輸出Format.getPrettyFormat()OutputFormat.createPrettyPrint()
XPath 支持需額外 jdom-xpath 模塊原生內建 selectNodes()

四、常量定義

public interface Constants {
    String DATA_TABLE = "Table";
    String DATA_ROW = "Row";
    String DATA_ITEM = "Item";
}

五、進階操作補充

1. 屬性操作

Element user = new Element("User");
user.setAttribute("id", "123");
user.setAttribute(new Attribute("status", "active"));
String id = user.getAttributeValue("id");

2. 遍歷子元素

// Java 5+ 泛型
for (Element child : (List) parent.getChildren()) { ... }

// 獲取特定名稱子元素
Element row = parent.getChild("Row");          // 第一個
List rows = parent.getChildren("Row"); // 所有

3. 命名空間

Namespace ns = Namespace.getNamespace("ns", "https://example.com");
Element elem = new Element("Element", ns);
doc.getRootElement().addContent(elem);

六、性能限制與避坑

  • ❌ **大文件 (>5MB) 易 OOM** — 全量構建樹,無流式選項
  • ❌ **XPath 需額外依賴** — jaxen + jdom-xpath,版本兼容性差
  • ❌ **無 StAX 支持** — 無法流式寫入大文件
  • ✅ **小配置文件 (<100KB) 表現良好** — API 簡單,適合輕量級場景

七、遷移建議:JDOM → DOM4J/StAX

// JDOM 讀取
Document doc = new SAXBuilder().build(file);

// DOM4J 讀取 (API 極其相似)
Document doc = new SAXReader().read(file);

// StAX 讀取 (流式、低內存)
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader reader = factory.createXMLEventReader(new FileInputStream(file));
while (reader.hasNext()) {
    XMLEvent event = reader.nextEvent();
    // 事件驅動處理
}

八、總結

JDOM 以 **純 Java、API 直觀** 降低 XML 入門門檻,但 **大文件性能缺陷、XPath 非原生、生態停滯** 限制其在生產環境應用。理解其核心 API (Document/Element/SAXBuilder/XMLOutputter) 有助於維護存量代碼,新項目**強烈建議**選擇 **DOM4J (XPath 密集)**、**StAX (高性能流式)** 或 **JAXB (對象綁定)**。

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