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

JDOM 解析 XML 實戰詳解:Java 開發者的輕量級 XML 處理利器

     編輯:Java 相關知識

前言:為什麼選擇 JDOM

W3C DOM 為跨語言設計,API 風格偏向 C/C++,Java 開發者用起來「水土不服」。JDOM 由 Brett McLaughlin 與 Jason Hunter 發起,專為 Java 設計,遵循 Java 集合框架慣例,支援 XPath、Namespace、Filter 等現代特性,是 Java 處理 XML 的首選輕量級庫。

環境準備

依賴項

  • JDK 1.4+
  • SAX/DOM 解析器(如 Apache Xerces 2.5+)
  • JDOM 2.x (jdom.jar)

Maven 坐標(推薦)

<dependency>
    <groupId>org.jdom</groupId>
    <artifactId>jdom2</artifactId>
    <version>2.0.6</version>
</dependency>

核心類速覽

類包職責
SAXBuilderorg.jdom.input基於 SAX 解析器構建 Document
DOMBuilderorg.jdom.input從現有 DOM 樹構建 Document
Documentorg.jdomXML 文檔根節點
Elementorg.jdom元素節點(含屬性、子元素、文本)
XMLOutputterorg.jdom.output將 Document 輸出為 XML 文本/流
XPathExpressionorg.jdom.xpathXPath 查詢(JDOM 2.x 新增)

實戰案例:圖書館 XML 解析與修改

示例 XML (library.xml)

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book email="zhoujunhui">
        <name>rjzjh</name>
        <price>60.0</price>
    </book>
    <book email="author2">
        <name>Java核心技術</name>
        <price>89.9</price>
    </book>
</books>

完整 Java 代碼

package com.example.xml;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

public class JDomParseDemo {

    public static void main(String[] args) {
        String xmlPath = "library.xml";
        
        // 1. 建構解析器(false 表示不驗證 DTD)
        SAXBuilder builder = new SAXBuilder(false);
        
        try {
            // 2. 解析生成 Document 對象
            Document doc = builder.build(xmlPath);
            
            // 3. 獲取根元素
            Element root = doc.getRootElement(); // 
            
            // 4. 獲取所有  子元素
            List bookList = root.getChildren("book");
            
            // 5. 遍歷處理
            for (Element book : bookList) {
                // 5.1 讀取屬性
                String email = book.getAttributeValue("email");
                System.out.println("Author Email: " + email);
                
                // 5.2 讀取子元素文本(自動 trim)
                String name = book.getChildTextTrim("name");
                System.out.println("Book Name: " + name);
                
                // 5.3 修改子元素文本(僅內存中修改)
                book.getChild("name").setText("Modified: " + name);
            }
            
            // 6. 格式化輸出回文件
            XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
            outputter.output(doc, new FileOutputStream(xmlPath));
            
            System.out.println("XML 更新完成!");
            
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

關鍵 API 深度解析

1. 靈活的構建策略

// 默認 SAX 解析器(高性能、低內存)
SAXBuilder builder = new SAXBuilder(); 

// 指定 Xerces 解析器
SAXBuilder builder = new SAXBuilder("org.apache.xerces.parsers.SAXParser");

// 禁用驗證(加快解析速度)
SAXBuilder builder = new SAXBuilder(false);

2. 元素操作精髓

  • getChildren(name):返回 List,支援泛型與增強 for 循環
  • getChildTextTrim(name):一步到位獲取孫子文本並去除空白,避免空指針
  • getAttributeValue(name):直接獲取屬性字符串,無屬性返回 null
  • setText(content):修改元素文本內容,自動處理實體轉義

3. 輸出格式控制

// 緊湊格式(無縮進)
XMLOutputter outputter = new XMLOutputter(Format.getCompactFormat());

// 緩進格式(默認 2 空格,可自定義)
Format format = Format.getPrettyFormat();
format.setIndent("    "); // 4 空格
format.setEncoding("UTF-8");
XMLOutputter outputter = new XMLOutputter(format);

進階技巧:XPath 查詢(JDOM 2.x+)

// 編譯 XPath 表達式
XPathExpression xpath = XPathFactory.instance().compile(
    "//book[@email='zhoujunhui']/name", 
    Filters.element()
);

// 單次查詢
Element nameEl = xpath.evaluateFirst(doc);
if (nameEl != null) {
    System.out.println("XPath 查詢結果: " + nameEl.getTextTrim());
}

// 列表查詢
List allPrices = XPathFactory.instance().compile("//price", Filters.element()).evaluate(doc);
allPrices.forEach(e -> System.out.println("Price: " + e.getText()));

常見坑與避雷指南

問題原因解決方案
中文亂碼輸出編碼未指定Format.getPrettyFormat().setEncoding("UTF-8")
大文件 OOMDOM 模型全量載入內存改用 SAX/StAX 流式解析,或 JDOM 的 SAXHandler 自定義處理
Namespace 失效未正確處理命名空間使用 Namespace.getNamespace(prefix, uri) 獲取 Namespace 對象傳給 getChild/Attribute
實體解析錯誤DTD/Schema 未聲明設置 EntityResolver 或禁用驗證 new SAXBuilder(false)

總結

JDOM 以「Java 原生」API 設計,讓 XML 處理回歸 Java 集合框架直覺體驗。掌握 SAXBuilder 解析、Element 導航修改、XMLOutputter 輸出三板斧,配合 XPath 強大查詢,即可應對 90% 的 XML 處理場景。對於超大文件或高性能場景,請轉向 StAX/SAX 流式處理。

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