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

JavaWeb 學習筆記:使用 JDOM 解析與生成 XML 文檔

     編輯:Java 綜合教學

JavaWeb 學習筆記:使用 JDOM 解析與生成 XML 文檔

一、前言:什麼是 JDOM?

JDOM 是一個開源的 Java XML 處理庫,基於樹形結構,純 Java 實現,專為 Java 開發者設計。它結合了 SAX(事件驅動、低內存)與 DOM(樹形、易操作)的優點,利用 Java 集合框架與方法重載特性,提供直觀、邏輯清晰的 API,大幅簡化 XML 文檔的解析、生成、序列化與操作。

JDOM 核心優勢

  • 輕量級:比標準 DOM 佔用更少內存,適合中小型 XML 文檔處理。
  • 原生 Java 體驗:大量使用 List、Iterator 等集合接口,代碼風格與 Java 標準庫一致。
  • 多数據源支持:除文件外,可直接從 SQL 查詢結果、InputStream、URL 等構建文檔對象。

JDOM 核心包結構

包名功能說明
org.jdom核心類:Document、Element、Attribute、Text 等
org.jdom.input輸入構建器:SAXBuilder、DOMBuilder、StAXBuilder
org.jdom.output輸出工具:XMLOutputter(格式化輸出至流/文件)
org.jdom.filter過濾器:ElementFilter、ContentFilter 等
org.jdom.transform轉換器:JDOMResult、JDOMSource(與 XSLT/StAX 互操作)
org.jdom.adapters適配器:橋接第三方 DOM 實現(如 Xerces、Crimson)

二、實戰操作:創建與解析 XML

環境準備

  1. 下載 jdom-2.x.x.jar 與 jdom-2.x.x-javadoc.jar(官網:jdom.org)
  2. 將 JAR 放入項目 lib 目錄並加入構建路徑

JDOM JAR 導入示例

示例 1:生成 XML 文件 (people.xml)

package com.book.jdom;

import java.io.FileOutputStream;
import java.io.IOException;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class CreateJdom {
    public static void main(String[] args) {
        // 1. 構建元素樹
        Element root = new Element("people");
        Element student = new Element("student");
        student.setAttribute("name", "張三");
        student.setAttribute("salary", "8000");
        student.setText("呵呵");
        root.addContent(student);

        // 2. 創建文檔對象
        Document doc = new Document(root);

        // 3. 配置輸出格式
        Format format = Format.getCompactFormat();
        format.setEncoding("UTF-8");
        format.setIndent("    "); // 4 空格縮進

        // 4. 輸出到文件
        XMLOutputter xmlout = new XMLOutputter(format);
        try (FileOutputStream fos = new FileOutputStream("people.xml")) {
            xmlout.output(doc, fos);
            System.out.println("成功!生成文件:people.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果:

<?xml version="1.0" encoding="UTF-8"?>
<people>
    <student name="張三" salary="8000">呵呵</student>
</people>

示例 2:解析 XML 文件

package com.book.jdom;

import java.io.IOException;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class Readxml {
    public static void main(String[] args) {
        SAXBuilder sax = new SAXBuilder();
        try {
            Document doc = sax.build("people.xml");
            Element root = doc.getRootElement();
            List<Element> students = root.getChildren("student");

            for (Element stu : students) {
                System.out.println("name:" + stu.getAttributeValue("name") 
                    + " salary:" + stu.getAttributeValue("salary"));
                System.out.println("text:" + stu.getText());
            }
        } catch (JDOMException | IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果:

name:張三 salary:8000
text:呵呵

三、進階案例:解析複雜巢狀結構

針對包含多層巢狀 <Key> 與 <Value> 的配置型 XML,展示多層遍歷與條件提取技巧:

package input;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ReadXML {
    public static void main(String[] args) throws JDOMException, IOException {
        SAXBuilder sb = new SAXBuilder();
        Document doc = sb.build(ReadXML.class.getClassLoader()
            .getResourceAsStream("nation.xml"));
        Element root = doc.getRootElement();

        // 獲取所有頂層 Key 元素
        List<Element> keys = root.getChildren("Key");
        for (Element key : keys) {
            String country = key.getAttributeValue("Name");
            System.out.print(country);

            // 1. 直接子 Value:提取 PhotoIDWidth
            List<Element> values = key.getChildren("Value");
            for (Element v : values) {
                if ("PhotoIDWidth".equals(v.getAttributeValue("Name"))) {
                    System.out.print("<--------->" + v.getAttributeValue("Name") 
                        + "," + v.getText());
                }
            }

            // 2. 巢狀 Key -> Child -> HeadPercent
            List<Element> subKeys = key.getChildren("Key");
            for (Element sk : subKeys) {
                if ("Child".equals(sk.getAttributeValue("Name"))) {
                    List<Element> childValues = sk.getChildren("Value");
                    for (Element cv : childValues) {
                        if ("HeadPercent".equals(cv.getAttributeValue("Name"))) {
                            System.out.println("<--------->" + cv.getText());
                        }
                    }
                }
            }
        }
    }
}

輸出結果:

China<--------->PhotoIDWidth,38PhotoIDWidth<--------->0.60ChildHeadPercent
Australia<--------->PhotoIDWidth,35PhotoIDWidth<--------->0.711ChildHeadPercent
Austria<--------->PhotoIDWidth,35PhotoIDWidth<--------->0.689ChildHeadPercent

JDOM 解析複雜 XML 示例

四、總結

JDOM 以其「純 Java、API 直觀、內存效率高」的特點,成為 Java 處理中小型 XML 文檔的優選方案。本文涵蓋了從環境搭建、基本增刪改查到複雜巢狀結構解析的完整實戰,讀者可直接套用代碼模板至實際項目中。對於大型 XML(超過百 MB),建議改用 SAX 或 StAX 流式解析以避免 OOM 風險。

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