最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java利用DOM解析XML的學(xué)習(xí)指南

 更新時(shí)間:2025年04月15日 10:17:34   作者:五行星辰  
在Java中使用DOM解析XML文件是一個(gè)常見的操作,它允許你以編程方式讀取、修改和保存XML文檔的結(jié)構(gòu)和內(nèi)容,本文為大家介紹了具體的實(shí)現(xiàn)步驟,有需要的小伙伴可以參考下

一、DOM原理:XML的"克隆人戰(zhàn)爭(zhēng)"

想象你要復(fù)制整個(gè)迪士尼樂園:

全量加載術(shù):把XML文件整個(gè)吞進(jìn)內(nèi)存,變成一顆節(jié)點(diǎn)樹(就像把城堡圖紙轉(zhuǎn)成3D模型)

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

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

二、實(shí)戰(zhàn)演練:用DOM搭建"程序員主題樂園"

項(xiàng)目藍(lán)圖(programmer_park.xml):

<主題樂園 名稱="996快樂谷">
    <區(qū)域 類型="代碼深淵" geohash="wx4g0b1">
        <設(shè)施 id="1">
            <名稱>無限續(xù)杯咖啡廳</名稱>
            <危險(xiǎn)等級(jí)>★★★★☆</危險(xiǎn)等級(jí)>
        </設(shè)施>
        <設(shè)施 id="2">
            <名稱>需求變更過山車</名稱>
            <危險(xiǎn)等級(jí)>★★★★★</危險(xiǎn)等級(jí)>
        </設(shè)施>
    </區(qū)域>
</主題樂園>

建筑師工具包(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 {
        // 裝載整個(gè)樂園到內(nèi)存
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document park = builder.parse("programmer_park.xml");

        // 打印所有危險(xiǎn)設(shè)施
        NodeList rides = park.getElementsByTagName("設(shè)施");
        System.out.println("?? 高危設(shè)施列表:");
        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("危險(xiǎn)等級(jí)").item(0).getTextContent();
            System.out.println(name + " | 危險(xiǎn)指數(shù):" + level);
        }

        // 新增一個(gè)奪命設(shè)施
        Element newRide = park.createElement("設(shè)施");
        newRide.setAttribute("id", "3");
        
        Element name = park.createElement("名稱");
        name.appendChild(park.createTextNode("Deadline蹦極臺(tái)"));
        
        Element level = park.createElement("危險(xiǎn)等級(jí)");
        level.appendChild(park.createTextNode("★★★★★★")); // 突破五星!

        newRide.appendChild(name);
        newRide.appendChild(level);
        park.getDocumentElement().getFirstChild().appendChild(newRide);

        // 保存修改后的樂園(小心內(nèi)存泄漏?。?
        Transformer transformer = TransformerFactory.newInstance().newTransformer();
        transformer.transform(new DOMSource(park), 
            new StreamResult("programmer_park_modified.xml"));
    }
}

運(yùn)行結(jié)果:

?? 高危設(shè)施列表:
無限續(xù)杯咖啡廳 | 危險(xiǎn)指數(shù):★★★★☆
需求變更過山車 | 危險(xiǎn)指數(shù):★★★★★

(生成的新XML會(huì)多出一個(gè)"Deadline蹦極臺(tái)",危險(xiǎn)指數(shù)突破天際?。?/p>

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

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

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

1.XPath閃電定位

用XPath直接空降到指定節(jié)點(diǎn),像使用傳送門:

XPath xpath = XPathFactory.newInstance().newXPath();
Node node = (Node) xpath.evaluate("http://設(shè)施[名稱='需求變更過山車']", 
    park, XPathConstants.NODE);

2.屬性隱身術(shù)

動(dòng)態(tài)修改geohash坐標(biāo),讓設(shè)施"瞬間移動(dòng)":

Element area = (Element) park.getElementsByTagName("區(qū)域").item(0);
area.setAttribute("geohash", "wx4g0b9"); // 從深淵傳送到廁所

3.節(jié)點(diǎn)克隆大法

復(fù)制過山車并改名,省時(shí)省力:

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

五、DOM的致命陷阱

1.內(nèi)存黑洞

加載1GB的XML文件 ≈ 在內(nèi)存里造航空母艦(小心OOM空襲?。?/p>

2.空白節(jié)點(diǎn)鬼打墻

XML中的換行符會(huì)被視為Text節(jié)點(diǎn),遍歷時(shí)可能踩坑:

// 錯(cuò)誤示范:直接取第一個(gè)子節(jié)點(diǎn)可能是空白文本節(jié)點(diǎn)!
// Element name = (Element) ride.getFirstChild();

// 正確姿勢(shì):過濾文本節(jié)點(diǎn)
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);
        // 處理真實(shí)節(jié)點(diǎn)
    }
}

3.線程安全驚魂

Document對(duì)象不是線程安全的!多個(gè)線程同時(shí)裝修會(huì)拆了你的樂高城堡。

六、DOM哲學(xué):內(nèi)存即世界

每個(gè)Element節(jié)點(diǎn)都是樂高積木

每個(gè)Text節(jié)點(diǎn)都是積木上的貼紙

每個(gè)Attribute都是積木的卡扣設(shè)計(jì)

到此這篇關(guān)于Java利用DOM解析XML的學(xué)習(xí)指南的文章就介紹到這了,更多相關(guān)Java DOM解析XML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自定義log4j日志文件命名規(guī)則說明

    自定義log4j日志文件命名規(guī)則說明

    這篇文章主要介紹了自定義log4j日志文件命名規(guī)則說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • emoji表情與unicode編碼互轉(zhuǎn)的實(shí)現(xiàn)(JS,JAVA,C#)

    emoji表情與unicode編碼互轉(zhuǎn)的實(shí)現(xiàn)(JS,JAVA,C#)

    這篇文章主要介紹了emoji表情與unicode編碼互轉(zhuǎn)的實(shí)現(xiàn)(JS,JAVA,C#),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot啟動(dòng)原理深入解析

    SpringBoot啟動(dòng)原理深入解析

    我們開發(fā)任何一個(gè)Spring Boot項(xiàng)目都會(huì)用到啟動(dòng)類,下面這篇文章主要給大家介紹了關(guān)于SpringBoot啟動(dòng)原理解析的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例

    最近做個(gè)項(xiàng)目需要統(tǒng)計(jì)在線用戶,本文主要介紹了springboot項(xiàng)目Redis統(tǒng)計(jì)在線用戶的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-06-06
  • 使用Spring Data MongoDB進(jìn)行地理位置相關(guān)查詢的步驟和示例

    使用Spring Data MongoDB進(jìn)行地理位置相關(guān)查詢的步驟和示例

    SpringData MongoDB是SpringData技術(shù)封裝了mongodb-driver技術(shù)之后的產(chǎn)物,它可以用更加簡(jiǎn)單的方式操作MongoDB,本文給大家介紹了如何使用Spring Data MongoDB進(jìn)行地理位置相關(guān)查詢的步驟和示例,需要的朋友可以參考下
    2025-05-05
  • 簡(jiǎn)單了解java集合框架LinkedList使用方法

    簡(jiǎn)單了解java集合框架LinkedList使用方法

    這篇文章主要介紹了簡(jiǎn)單了解java集合框架LinkedList使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 一文搞懂Java的SPI機(jī)制(推薦)

    一文搞懂Java的SPI機(jī)制(推薦)

    Java定義了一套JDBC的接口,但并未提供具體實(shí)現(xiàn)類,而是在不同云廠商提供的數(shù)據(jù)庫實(shí)現(xiàn)包。這篇文章給大家介紹Java的SPI機(jī)制,感興趣的朋友一起看看吧
    2021-11-11
  • Java設(shè)計(jì)模式之命令模式CommandPattern詳解

    Java設(shè)計(jì)模式之命令模式CommandPattern詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之命令模式CommandPattern詳解,命令模式是把一個(gè)請(qǐng)求封裝為一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶進(jìn)行參數(shù)化;對(duì)請(qǐng)求排隊(duì)或記錄請(qǐng)求日志,以及支持可撤銷的操作,需要的朋友可以參考下
    2023-10-10
  • 一文帶你了解FastExcel的使用

    一文帶你了解FastExcel的使用

    我們知道?EasyExcel?在作者從阿里離職之后就停止維護(hù)了,但在前兩周?EasyExcel?原作者推出了他的升級(jí)版框架?FastExcel,下面小編就來和大家聊聊FastExcel的具體使用吧
    2024-12-12
  • 淺談mybatis-plus批量保存異常及效率優(yōu)化

    淺談mybatis-plus批量保存異常及效率優(yōu)化

    本文主要介紹了mybatis-plus批量保存異常及效率優(yōu)化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評(píng)論

张家川| 临泉县| 金溪县| 徐汇区| 东港市| 中西区| 峨山| 美姑县| 城口县| 通山县| 铜鼓县| 曲松县| 溆浦县| 金坛市| 金沙县| 奉贤区| 固镇县| 邹城市| 韶山市| 赞皇县| 兴城市| 麟游县| 康乐县| 建水县| 乌拉特后旗| 区。| 金坛市| 墨脱县| 团风县| 全椒县| 大同县| 凤山县| 宾川县| 永和县| 宿松县| 大新县| 黄骅市| 周至县| 兴文县| 景泰县| 临西县|