DOM解析XML:Java程序員的“樂高積木式“數據搭建

各位代碼建筑師們!今天我們要玩一個把XML變成內存樂高城堡的游戲——DOM解析!和SAX那種"邊看監控邊破案"的刺激不同,DOM就像把整個樂高說明書一次性倒進大腦,然后慢慢拼裝(內存:你不要過來啊!)


一、DOM原理:XML的"克隆人戰爭"

想象你要復制整個迪士尼樂園:

  1. 全量加載術
    把XML文件整個吞進內存,變成一顆節點樹(就像把城堡圖紙轉成3D模型)

  2. 隨機訪問特權
    可以隨時瞬移到任意角落:“我要修改第三塊磚的顏色!”(而SAX只能從頭看到尾)

  3. 修改超能力
    支持增刪改查,像玩《模擬人生》一樣隨意改造XML世界


二、實戰演練:用DOM搭建"程序員主題樂園"

項目藍圖(programmer_park.xml):

<主題樂園 名稱="996快樂谷"><區域 類型="代碼深淵" geohash="wx4g0b1"><設施 id="1"><名稱>無限續杯咖啡廳</名稱><危險等級>★★★★☆</危險等級></設施><設施 id="2"><名稱>需求變更過山車</名稱><危險等級>★★★★★</危險等級></設施></區域>
</主題樂園>

建筑師工具包(DomArchitect.java):

import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class DomArchitect {public static void main(String[] args) throws Exception {// 裝載整個樂園到內存DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document park = builder.parse("programmer_park.xml");// 打印所有危險設施NodeList rides = park.getElementsByTagName("設施");System.out.println("?? 高危設施列表:");for (int i=0; i<rides.getLength(); i++) {Element ride = (Element) rides.item(i);String name = ride.getElementsByTagName("名稱").item(0).getTextContent();String level = ride.getElementsByTagName("危險等級").item(0).getTextContent();System.out.println(name + " | 危險指數:" + level);}// 新增一個奪命設施Element newRide = park.createElement("設施");newRide.setAttribute("id", "3");Element name = park.createElement("名稱");name.appendChild(park.createTextNode("Deadline蹦極臺"));Element level = park.createElement("危險等級");level.appendChild(park.createTextNode("★★★★★★")); // 突破五星!newRide.appendChild(name);newRide.appendChild(level);park.getDocumentElement().getFirstChild().appendChild(newRide);// 保存修改后的樂園(小心內存泄漏!)Transformer transformer = TransformerFactory.newInstance().newTransformer();transformer.transform(new DOMSource(park), new StreamResult("programmer_park_modified.xml"));}
}

運行結果:

?? 高危設施列表:
無限續杯咖啡廳 | 危險指數:★★★★☆
需求變更過山車 | 危險指數:★★★★★

(生成的新XML會多出一個"Deadline蹦極臺",危險指數突破天際!)


三、DOM vs SAX:建筑師與偵探的巔峰對決

DOM建筑師 🏗?SAX偵探 🕵?♂?
內存消耗需要搬來整個建材市場(全量加載)只帶偵探工具包(流式處理)
操作方式可以隨意拆墻裝修(隨機修改)只能做現場記錄(只讀)
響應速度裝修前要先運材料(初始化慢)到達現場立即開工(啟動快)
適用場景需要改結構的精致小別墅快速搜查犯罪現場的超大倉庫

四、DOM操作三大"騷操作"

  1. XPath閃電定位
    用XPath直接空降到指定節點,像使用傳送門:

    XPath xpath = XPathFactory.newInstance().newXPath();
    Node node = (Node) xpath.evaluate("//設施[名稱='需求變更過山車']", park, XPathConstants.NODE);
    
  2. 屬性隱身術
    動態修改geohash坐標,讓設施"瞬間移動":

    Element area = (Element) park.getElementsByTagName("區域").item(0);
    area.setAttribute("geohash", "wx4g0b9"); // 從深淵傳送到廁所
    
  3. 節點克隆大法
    復制過山車并改名,省時省力:

    Node clonedRide = rides.item(1).cloneNode(true);
    ((Element)clonedRide).setAttribute("id", "4");
    clonedRide.getChildNodes().item(0).setTextContent("需求復活過山車");
    

五、DOM的致命陷阱

  1. 內存黑洞
    加載1GB的XML文件 ≈ 在內存里造航空母艦(小心OOM空襲!)

  2. 空白節點鬼打墻
    XML中的換行符會被視為Text節點,遍歷時可能踩坑:

    // 錯誤示范:直接取第一個子節點可能是空白文本節點!
    // Element name = (Element) ride.getFirstChild();// 正確姿勢:過濾文本節點
    NodeList children = ride.getChildNodes();
    for (int i=0; i<children.getLength(); i++) {if (children.item(i).getNodeType() == Node.ELEMENT_NODE) {Element child = (Element) children.item(i);// 處理真實節點}
    }
    
  3. 線程安全驚魂
    Document對象不是線程安全的!多個線程同時裝修會拆了你的樂高城堡。


六、DOM哲學:內存即世界

  • 每個Element節點都是樂高積木
  • 每個Text節點都是積木上的貼紙
  • 每個Attribute都是積木的卡扣設計
  • 而內存溢出…是你野心太大想造死星的下場

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

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

相關文章

Apache Nifi安裝與嘗試

Apache NIFI中文文檔 地址&#xff1a;https://nifichina.github.io/ 下載安裝配置 1、環境準備 Nifi的運行需要依賴于java環境&#xff0c;所以本機上需要安裝java環境&#xff0c;并配置環境變量。 1.1查看本機是否已經存在java環境 請先執行以下命令找出系統中真實可用…

我可能用到的網站和軟件

我可能用到的網站和軟件 程序員交流的網站代碼管理工具前端組件庫前端框架在線工具人工智能問答工具學習的網站Windows系統電腦的常用工具 程序員交流的網站 csdn博客博客園 - 開發者的網上家園InfoQ - 軟件開發及相關領域-極客邦掘金 (juejin.cn) 代碼管理工具 GitHub 有時…

使用SSH解決在IDEA中Push出現403的問題

錯誤截圖&#xff1a; 控制臺日志&#xff1a; 12:15:34.649: [xxx] git -c core.quotepathfalse -c log.showSignaturefalse push --progress --porcelain master refs/heads/master:master fatal: unable to access https://github.com/xxx.git/: The requested URL return…

JavaScript異常機制與嚴格模式

目錄 JavaScript 異常機制 1. 基本語法&#xff1a;try...catch...finally 2. 拋出異常&#xff1a;throw 3. 錯誤對象屬性 4. 同步代碼的異常處理 5. 異步代碼的異常處理 5.1 回調函數 5.2 Promise 5.3 全局未捕獲的 Promise 錯誤 6. 全局錯誤處理 7. 自定義錯誤與…

中廠算法崗面試總結

時間&#xff1a;2025.4.10 地點&#xff1a;上市的電子有限公司 面試流程&#xff1a; 1.由負責人講解公司文化 2&#xff0c;由技術人員講解公司的技術崗位&#xff0c;還有成果 3.帶領參觀各個工作位置&#xff0c;還有場所 4.中午吃飯 5.面試題&#xff0c;閉卷考試…

vue+flask圖書知識圖譜推薦系統

文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01; 編號: F025 架構: vueflaskneo4jmysql 亮點&#xff1a;協同過濾推薦算法知識圖譜可視化 支持爬取圖書數據&#xff0c;數據超過萬條&am…

MySQL NDB Cluster詳解

MySQL NDB Cluster&#xff08;MNC&#xff09; 是MySQL提供的一種分布式數據庫解決方案&#xff0c;旨在提供高可用性、高性能的數據庫服務。它通過 NDB&#xff08;Network DataBase&#xff09; 存儲引擎實現了高可用性和分布式存儲&#xff0c;在NDB中&#xff0c;數據通過…

解決華碩主板Z890m下載ubuntu20.04后沒有以太網問題

問題描述&#xff1a; 華碩主板Z890m下載雙系統ubuntu20.04后&#xff0c;發現ubuntu不能打開以太網。 問題原因&#xff1a; 華碩主板的網卡驅動是r8125,而ubuntu20.04的驅動版本是r8169&#xff0c;所以是網卡驅動不匹配造成 解決方案 開機界面按下F2進入BOIS模式&#…

JS里對于集合的簡單介紹

JS的集合 前言一、集合二、基本使用1. 創建集合2. 添加元素3. 刪除元素4. 檢查元素5. 清空集合6. 集合的大小 三、擴展使用1. 遍歷集合2. 從數組創建集合3. 集合的應用場景 四、總結 前言 JS里對于集合的簡單介紹 同數學的集合&#xff0c;有無序性、唯一性 注意&#xff1a;…

pytorch 反向傳播

文章目錄 概念計算圖自動求導的兩種模式 自動求導-代碼標量的反向傳播非標量變量的反向傳播將某些計算移動到計算圖之外 概念 核心&#xff1a;鏈式法則 深度學習框架通過自動計算導數(自動微分)來加快求導。 實踐中&#xff0c;根據涉及號的模型&#xff0c;系統會構建一個計…

Kotlin日常使用函數記錄

文章目錄 前言字符串集合1.兩個集合的差集2.集合轉數組2.1.集合轉基本數據類型數組2.2.集合轉對象數組 Map1.合并Map1.1.使用 操作符1.2.使用 操作符1.3.使用 putAll 方法1.4.使用 merge 函數 前言 記錄一些kotlin開發中&#xff0c;日常使用的函數和方式之類的&#xff0c;…

詳解正則表達式中的?:、?= 、 ?! 、?<=、?<!

1、?: - 非捕獲組 語法: (?:pattern) 作用: 創建一個分組但不捕獲匹配結果&#xff0c;不會將匹配的文本存儲到內存中供后續使用。 優勢: 提高性能和效率 不占用編號&#xff08;不會影響后續捕獲組的編號&#xff09; 減少內存使用 // 使用捕獲組 let regex1 /(hell…

【無標題】spark編程

Value類型&#xff1a; 9) distinct ? 函數簽名 def distinct()(implicit ord: Ordering[T] null): RDD[T] def distinct(numPartitions: Int)(implicit ord: Ordering[T] null): RDD[T] ? 函數說明 將數據集中重復的數據去重 val dataRDD sparkContext.makeRDD(Lis…

GPT-2 語言模型 - 模型訓練

本節代碼是一個完整的機器學習工作流程&#xff0c;用于訓練一個基于GPT-2的語言模型。下面是對這段代碼的詳細解釋&#xff1a; 文件目錄如下 1. 初始化和數據準備 設置隨機種子 random.seed(1002) 確保結果的可重復性。 定義參數 test_rate 0.2 context_length 128 tes…

架構師面試(二十九):TCP Socket 編程

問題 今天考察網絡編程的基礎知識。 在基于 TCP 協議的網絡 【socket 編程】中可能會遇到很多異常&#xff0c;在下面的相關描述中說法正確的有哪幾項呢&#xff1f; A. 在建立連接被拒絕時&#xff0c;有可能是因為網絡不通或地址錯誤或 server 端對應端口未被監聽&#x…

HTTP實現心跳模塊

HTTP實現心跳模塊 使用輕量級的cHTTP庫cpp-httplib重現實現HTTP心跳模塊 頭文件HttplibHeartbeat.h #ifndef HTTPLIB_HEARTBEAT_H #define HTTPLIB_HEARTBEAT_H#include <string> #include <thread> #include <atomic> #include <chrono> #include …

openharmony—release—4.1開發環境搭建(踩坑記錄)

環境開發需要分別在window以及ubuntu下進行相應設置 一、window 1.安裝DevEco Device Tool OpenAtom OpenHarmony 二、ubuntu 1.將Ubuntu Shell環境修改為bash ls -l /bin/sh 2.打開終端工具&#xff0c;執行如下命令&#xff0c;輸入密碼&#xff0c;然后選擇No&#xff0…

Go學習系列文章聲明

本次學習是基于B站的視頻&#xff0c;【Udemy高分熱門付費課程】Golang&#xff1a;完整開發者指南&#xff08;基礎知識和高級特性&#xff09;中英文字幕_嗶哩嗶哩_bilibili 本人會嘗試輸出視頻中的內容&#xff0c;如有錯誤歡迎指出 next page: Go installation process

error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408

在git push時報錯&#xff1a;error: RPC failed; HTTP 408 curl 22 The requested URL returned error: 408 原因&#xff1a;可能是推送的文件太大&#xff0c;要么是緩存不夠&#xff0c;要么是網絡不行。 解決方法&#xff1a; 將本地 http.postBuffer 數值調整到500MB&…

Android.bp中添加條件判斷編譯方式

背景&#xff1a; 馬哥學員朋友以前在vip群里&#xff0c;有問道如何在Android.bp中添加條件判斷&#xff0c;在工作中經常需要一套代碼兼容發貨目標版本&#xff0c;即代碼都是公共的一套&#xff0c;但是需要用這一套代碼集成到各個產品設備上 但是這個產品設備可能面臨比…