JDOM處理XML:Java程序員的“樂高積木2.0版“

各位代碼建筑師們!今天我們要玩一款比原生DOM更"Java友好"的XML積木套裝——JDOM!它像樂高得寶系列(Duplo)一樣簡單易用,卻能讓你的XML工程穩如霍格沃茨城堡!(溫馨提示:別用它造魂器,容易內存泄漏!)


一、JDOM絕殺技:原生DOM的"整容手術"

  1. 純Java基因
    不用再忍受DOM的NodeList這種反人類設計,直接使用List<Element>操作,像喝黃油啤酒般順滑

  2. 建造者模式
    Document doc = new Document(new Element("root"))就能起高樓,比DOM的createElement三連擊爽快10倍

  3. XPath外掛
    支持XPathFactory直接查詢,找節點比找廚房里的蟑螂還容易


二、實戰演練:用JDOM搭建"霍格沃茨課程表"

魔法課程表結構(courses.xml):

<課程表 年份="2024"><學院 名稱="格蘭芬多"><課程 時間="周一9:00"><名稱>黑魔法防御術</名稱><教授>盧平</教授></課程><課程 時間="周三14:00"><名稱>魁地奇訓練</名稱><教授>霍琦夫人</教授></課程></學院>
</課程表>

魔法代碼(JDomWizard.java):

import org.jdom2.*;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.*;
import java.util.List;public class JDomWizard {public static void main(String[] args) throws Exception {// 解析現有課程表(比貓頭鷹送信更快)SAXBuilder builder = new SAXBuilder();Document doc = builder.build("courses.xml");// 查找所有課程(使用XPath比飛賊還快)List<Element> courses = doc.getRootElement().getChild("學院").getChildren("課程");System.out.println("🦁 格蘭芬多課程表:");courses.forEach(course -> {String time = course.getAttributeValue("時間");String name = course.getChildText("名稱");System.out.println(time + " | " + name);});// 添加新課程(比變形咒還方便)Element newCourse = new Element("課程").setAttribute("時間", "周五19:00").addContent(new Element("名稱").setText("夜游指導")).addContent(new Element("教授").setText("費爾奇"));doc.getRootElement().getChild("學院").addContent(newCourse);// 保存修改(用魔杖刻錄)XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());outputter.output(doc, new FileWriter("courses_modified.xml"));}
}

輸出結果:

🦁 格蘭芬多課程表:
周一9:00 | 黑魔法防御術
周三14:00 | 魁地奇訓練

(生成的新XML將包含費爾奇的"夜游指導"課程——雖然這課可能教怎么抓夜游學生)


三、JDOM五大神器

  1. 元素速成咒

    Element potion = new Element("魔藥課").setAttribute("教室", "地牢").addContent(new Element("材料").setText("非洲樹蛇皮"));
    
  2. 安全護盾(防御XXE)

    SAXBuilder builder = new SAXBuilder();
    builder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
    
  3. 流式輸出術(處理大文件)

    XMLOutputter outputter = new XMLOutputter();
    try (FileWriter writer = new FileWriter("big_data.xml")) {outputter.output(new Element("root"), writer); // 先寫開頭for(Element data : hugeList) {outputter.output(data, writer); // 分批寫入}outputter.output(new Element("/root"), writer); // 手動閉合
    }
    
  4. 元素過濾器

    List<Element> dangerousCourses = courses.stream().filter(c -> c.getChildText("教授").equals("烏姆里奇")).collect(Collectors.toList());
    
  5. DTD驗證器

    SAXBuilder builder = new SAXBuilder();
    builder.setValidation(true);
    builder.setEntityResolver(new ClasspathEntityResolver()); // 驗證DTD
    

四、JDOM vs dom4j:光輪2000 vs 火弩箭

JDOM光輪2000 🧹dom4j火弩箭 🚀
API設計更符合Java習慣靈活但稍顯復雜
依賴純JDK+自身jar依賴XPP3等
維護狀態活躍維護已進入維護模式
學習曲線適合剛接觸XML的新手適合需要高級功能的開發者

五、JDOM三大禁忌

  1. 內存沼澤
    處理GB級XML文件時,JDOM會把整個文件吞進內存,像吃了膨化咒的洛麗絲夫人

  2. 并發詛咒
    Document對象非線程安全,多線程操作需要同步鎖(類似看守博格特)

  3. XPath性能陷阱
    復雜XPath查詢在大型文檔中可能比嗅嗅找金幣還慢


六、JDOM安全防護咒

  1. 輸入消毒術

    public String sanitize(String input) {return input.replaceAll("[<>&]", "_"); // 替換特殊字符
    }
    
  2. 白名單驗證

    List<String> allowedTags = Arrays.asList("課程", "教授");
    if(!allowedTags.contains(element.getName())) {throw new 黑魔法防御術Exception();
    }
    
  3. 內存限制咒

    SAXBuilder builder = new SAXBuilder();
    builder.setEntityExpansionLimit(50); // 限制實體擴展次數
    

七、JDOM哲學:XML即Java對象

  • 每個Element都是可組合的魔法積木
  • 每個Attribute都是積木的拼接卡扣
  • 每個Document都是你的霍格沃茨城堡
  • 而內存溢出…是試圖在塔樓里造魁地奇球場的后果

(最后提醒:使用try-with-resources關閉資源,否則家養小精靈會罷工!)🔚

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902075.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【后端開發】Spring日志

文章目錄 Spring日志日志作用日志測試日志信息日志級別日志配置配置日志級別日志持久化日志文件分割 注解的使用 Spring日志 日志作用 系統監控&#xff1a;可以通過日志記錄這個系統的運行狀態&#xff0c;對數據進行分析&#xff0c;設置不同的規則&#xff0c;超過閾值時進…

探索大語言模型(LLM):Transformer 與 BERT從原理到實踐

Transformer 與 BERT&#xff1a;從原理到實踐 前言一、背景介紹二、核心公式推導1. 注意力機制&#xff08;Attention Mechanism&#xff09;2. 多頭注意力機制&#xff08;Multi-Head Attention&#xff09;3. Transformer 編碼器&#xff08;Transformer Encoder&#xff09…

計算機網絡八股——HTTP協議與HTTPS協議

目錄 HTTP1.1簡述與特性 1. 報文清晰易讀 2. 靈活和易于擴展 3. ?狀態 Cookie和Session 4. 明?傳輸、不安全 HTTP協議發展過程 HTTP/1.1的不足 HTTP/2.0 HTTP/3.0 HTTPS協議 HTTP協議和HTTPS協議的區別 HTTPS中的加密方式 HTTPS中建立連接的方式 前言&#xff…

QML中的3D功能--入門開發

Qt Quick 提供了強大的 3D 功能支持,主要通過 Qt 3D 模塊實現。以下是 QML 中開發 3D 應用的全面指南。 1. 基本配置 環境要求 Qt 5.10 或更高版本(推薦 Qt 6.x) 啟用 Qt 3D 模塊 支持 OpenGL 的硬件 項目配置 在 .pro 文件中添加: QT += 3dcore 3drender 3dinput 3dex…

Git合并分支的兩種常用方式`git merge`和`git cherry-pick`

Git合并分支的兩種常用方式git merge和git cherry-pick 寫在前面1. git merge用途工作方式使用git命令方式合并使用idea工具方式合并 2. git cherry-pick用途工作方式使用git命令方式合并使用idea工具方式合并 3. 區別總結 寫在前面 一般我們使用git合并分支常用的就是git mer…

Web三漏洞學習(其三:rce漏洞)

靶場&#xff1a;NSSCTF 三、RCE漏洞 1、概述 在Web應用開發中會讓應用調用代碼執行函數或系統命令執行函數處理&#xff0c;若應用對用戶的輸入過濾不嚴&#xff0c;容易產生遠程代碼執行漏洞或系統命令執行漏洞 所以常見的RCE漏洞函數又分為代碼執行函數和系統命令執行函數…

從零開始:Python運行環境之VSCode與Anaconda安裝配置全攻略 (1)

從零開始&#xff1a;Python 運行環境之 VSCode 與 Anaconda 安裝配置全攻略 在當今數字化時代&#xff0c;Python 作為一種功能強大且易于學習的編程語言&#xff0c;被廣泛應用于數據科學、人工智能、Web 開發等眾多領域。為了順利開啟 Python 編程之旅&#xff0c;搭建一個穩…

從FPGA實現角度介紹DP_Main_link主通道原理

DisplayPort&#xff08;簡稱DP&#xff09;是一個標準化的數字式視頻接口標準&#xff0c;具有三大基本架構包含影音傳輸的主要通道&#xff08;Main Link&#xff09;、輔助通道&#xff08;AUX&#xff09;、與熱插拔&#xff08;HPD&#xff09;。 Main Link&#xff1a;用…

嵌入式軟件--stm32 DAY 2

大家學習嵌入式的時候&#xff0c;多多學習用KEIL寫代碼&#xff0c;雖然作為編譯器&#xff0c;大家常用vscode等常用工具關聯編碼&#xff0c;但目前keil仍然是主流工具之一&#xff0c;學習掌握十分必要。 1.再次創建項目 1.1編譯器自動生成文件 1.2初始文件 這樣下次創建新…

游戲引擎學習第234天:實現基數排序

回顧并為今天的內容設定背景 我們今天繼續進行排序的相關&#xff0c;雖然基本已經完成了&#xff0c;但還是想收尾一下&#xff0c;讓整個流程更完整。其實這次排序只是個借口&#xff0c;主要是想順便聊一聊一些計算機科學的知識點&#xff0c;這些內容在我們項目中平時不會…

計算機網絡——常見的網絡攻擊手段

什么是XSS攻擊&#xff0c;如何避免? XSS 攻擊&#xff0c;全稱跨站腳本攻擊&#xff08;Cross-Site Scripting&#xff09;&#xff0c;這會與層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆&#xff0c;因此有人將跨站腳本攻擊縮寫為XSS。它指的是惡意攻擊者往Web頁面…

Agent的九種設計模式 介紹

Agent的九種設計模式 介紹 一、ReAct模式 原理:將推理(Reasoning)和行動(Acting)相結合,使Agent能夠在推理的指導下采取行動,并根據行動的結果進一步推理,形成一個循環。Agent通過生成一系列的思維鏈(Thought Chains)來明確推理步驟,并根據推理結果執行相應的動作,…

LeetCode 熱題 100:回溯

46. 全排列 給定一個不含重復數字的數組 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 輸入&#xff…

cJSON_Print 和 cJSON_PrintUnformatted的區別

cJSON_Print 和 cJSON_PrintUnformatted 是 cJSON 庫中用于將 cJSON 對象轉換為 JSON 字符串的兩個函數&#xff0c;它們的區別主要在于輸出的格式&#xff1a; 1. cJSON_Print 功能&#xff1a;將 cJSON 對象轉換為格式化的 JSON 字符串。 特點&#xff1a; 輸出的 JSON 字符…

A股周度復盤與下周策略 的deepseek提示詞模板

以下是反向整理的股票大盤分析提示詞模板&#xff0c;采用結構化框架數據占位符設計&#xff0c;可直接套用每周市場數據&#xff1a; 請根據一下markdown格式的模板&#xff0c;幫我檢索整理并輸出本周股市復盤和下周投資策略 【A股周度復盤與下周策略提示詞模板】 一、市場…

Linux下使用C++獲取硬件信息

目錄 方法獲取CPU信息&#xff1a;讀取"/proc/cpuinfo"文件獲取磁盤信息&#xff1a;讀取"/proc/diskstats"文件獲取BIOS信息有兩種方法&#xff1a;1、讀取文件&#xff1b;2、使用dmidecode命令獲取主板信息有兩種方法&#xff1a;1、讀取文件&#xff1…

BootStrap:進階使用(其二)

今天我要講述的是在BootStrap中第二篇關于進一步使用的方法與代碼舉例; 分頁&#xff1a; 對于一些大型網站而言&#xff0c;分頁是一個很有必要的存在&#xff0c;如果當數據內容過大時&#xff0c;則需要分頁來分擔一些&#xff0c;這可以使得大量內容能整合并全面地展示&a…

【技術派后端篇】技術派中的白名單機制:基于Redis的Set實現

在技術派社區中&#xff0c;為了保證文章的質量和社區的良性發展&#xff0c;所有發布的文章都需要經過審核。然而&#xff0c;并非所有作者的文章都需要審核&#xff0c;我們通過白名單機制來優化這一流程。本文將詳細介紹技術派中白名單的實現方式&#xff0c;以及如何利用Re…

TRAE.AI 國際版本

國際版下載地址&#xff1a; https://www.trae.ai/https://www.trae.ai/ 國際版本優勢&#xff1a;提供更多高校的AI助手模型 Claude-3.5-Sonnet Claude-3.7-Sonnet Gemini-2.5-Pro GPT-4.1 GPT-40 DeepSeek-V3-0324DeepSeek-V3DeepSeek-Reasoner(R1)

關于支付寶網頁提示非官方網頁

關于支付寶網站提示 非官方網站 需要找官方添加白名單 下面可以直接用自己的郵箱去發送申請 支付寶提示“非支付寶官方網頁&#xff0c;請確認是否繼續訪問”通常是因為支付寶的安全機制檢測到您訪問的頁面不是支付寶官方頁面&#xff0c;這可能是由于域名或頁面內容不符合支…