day08-XML

来源:https://www.cnblogs.com/liyuelian/archive/2022/11/03/16855944.html
-Advertisement-
Play Games

XML 官方文檔:https://www.w3school.com.cn/xml/index.asp 1.為什麼需要xml? 需求1:兩個程式間進行數據通信? 需求2:給一臺伺服器,做一個配置文件,當伺服器程式啟動時,去讀取它應當監聽的埠號、還有連接資料庫的用戶名和密碼 spring中的IOC配置 ...


XML

官方文檔:https://www.w3school.com.cn/xml/index.asp

1.為什麼需要xml?

  1. 需求1:兩個程式間進行數據通信?
  2. 需求2:給一臺伺服器,做一個配置文件,當伺服器程式啟動時,去讀取它應當監聽的埠號、還有連接資料庫的用戶名和密碼
  3. spring中的IOC配置文件beans.xml,mybatis的xxxMapper.xml文件,tomcat的server.xml,web.xml文件
  4. xml能存儲複雜的數據關係

xml技術用於解決什麼問題?

  • 解決程式間數據傳輸的問題:

    比如qq之間的數據傳送,用xml格式來傳輸數據,具有良好的可讀性,可維護性

    以前兩個程式間的通信用xml作為數據通信的格式,現在一般用json

  • xml可以做配置文件

    xml做配置文件可以說是非常的普遍,比如我們的tomcat伺服器的server.xml web.xml

  • xml可以充當小型的資料庫

    我們程式中可能用到的數據,如果放在資料庫中讀取不合適(因為你要增加維護資料庫工作),可以考慮直接用xml文件來做小型資料庫,而且直接讀取文件顯然要比讀取資料庫快

    現在也不太使用xml作數據存儲了

2.xml語法

  • 快速入門

需求:使用idea創建Students.xml存儲多個學生信息

<?xml version="1.0" encoding="UTF-8" ?>
<!--    1.xml:表示該文件的類型為xml
        2.version 表示版本
        3.encoding="UTF-8" 文件編碼為UTF-8
        4.students:root元素/根元素,名字自己定義
        5.<student> </student>表示一個students的子元素,可以有多個
        6.id就是屬性,name,age,gender是student元素的子元素
    -->
<students>
    <student id="100">
        <name>jack</name>
        <age>10</age>
        <gender>男</gender>
    </student>
    <student id="200">
        <name>Mary</name>
        <age>18</age>
        <gender>女</gender>
    </student>
</students>
  • 一個xml文檔分為如下幾部分內容
    • 文檔聲明
    • 元素
    • 屬性
    • 註釋
    • CDATA區、特殊字元

2.1文檔聲明

<?xml version="1.0" encoding="UTF-8" ?>
  1. xml聲明放在xml文檔的第一行
  2. xml聲明由以下幾個部分組成:
    • version:文檔符合xml1.0規範,我們學習1.0
    • encoding:文檔字元編碼,比如:utf-8

2.2元素

  1. 元素語法要求:
  • 每個xml文檔必須有且只有一個根元素
  • 根元素是一個完全包括文檔中其他所有元素的元素
  • 根元素的起始標記要放在所有其他元素的起始標記之前
  • 根元素的結束標記要放在所有其他元素的結束標記之後
  1. xml元素指xml文件中出現的標簽,一個標簽分為開始標簽和結束標簽,一個標簽有如下幾種書寫形式
  • 包含標簽體:<a>www.baidu.com</a>

  • 不含標簽體:<a></a>,簡寫為<a/>

  • 一個標簽中也可以嵌套若幹子標簽。但所有的標簽必須合理地嵌套,絕對不允許交叉嵌套

  1. 在很多時候,元素,節點,標簽是相同的意思
  2. xml元素命名規則:
    • 區分大小寫,例如:<P><p>是兩個不同的標記
    • 不能以數字開頭
    • 不能包含空格
    • 名稱中間不能包含冒號:
    • 如果標簽單詞需要間隔,建議使用下劃線

2.3屬性

屬性介紹:

  1. 屬性值用雙引號""或單引號''分隔(如果屬性值中有單引號'',就用雙引號""分隔,如過屬性值中有雙引號"",就用單引號''分隔)

  2. 一個元素可以用多個屬性,它的基本格式為:<元素名 屬性名="屬性值">

  3. 特定的屬性名稱在同一個元素標記中只能出現一次

    即屬性名稱在同一個元素中不能重覆

  4. 屬性值不能包括&字元

2.4註釋

  1. <!--這是一個註釋-->
  2. 註釋內容中不要出現 --
  3. 不要把註釋放在標記中間。錯誤寫法:<Name <!--the name-->>TOM</Name>
  4. 註釋不能嵌套
  5. 可以在除標記以外的任何地方放註釋

2.5CDATA節

有些內容不想讓解析引擎執行,而是當做原始內容(普通文本)處理,可以使用CDATA括起來,CDATA節中的所有字元都會被當做簡單文本,而不是xml標記

  1. 語法:

    <![CDATA[這裡可以把你輸入的字元原樣顯示,不會解析xml]]>
    
  2. 可以輸入任意字元(除]]>外)

  3. 不能嵌套

例子

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student>
        <code>
            <!--如果希望把某些字元串當做普通文本使用,就用CDATA括起來-->
            <![CDATA[
            <script data-compress=strip>
            function h(obj){
            alert("一段js代碼");
            }
            </script>
            ]]>
        </code>
    </student>
</students>

3.轉義字元

對於一些單個字元,若想顯示其原始樣式,也可以使用轉義的形式予以處理

image-20221103183955776

例子

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student>
        <name>jack</name>
        <age>10</age>
        <gender>男</gender>
        <!--轉義字元表示一些特殊的字元-->
        <resume>年齡&lt;&gt;&amp;</resume>
    </student>
</students>
  • 小結:

    遵循如下規則的xml文檔稱為格式正規的xml文檔:

  1. xml聲明語句<?xml version="1.0" encoding="UTF-8" ?>
  2. 必須有且僅有一個根元素
  3. 標記區分大小寫
  4. 屬性值用引號
  5. 標記成對
  6. 空標記關閉
  7. 元素正確嵌套

4.DOM4j

4.1xml解析技術原理和介紹

  • xml技術原理

    DOM (Document Object Model,文檔對象模型)定義了訪問和操作文檔的標準方法。

  1. 不管是html文件還是xml文件,都是標記型文檔,都可以使用w3c組織制定的dom技術來解析
  2. document對象表示的是整個文檔(可以是html文檔,也可以是xml文檔)
  3. DOM 把 XML 文檔作為樹結構來查看。能夠通過 DOM 樹來訪問所有元素。可以修改或刪除它們的內容,並創建新的元素。元素,它們的文本,以及它們的屬性,都被認為是節點
  • xml解析技術介紹

    早期 JDK 為我們提供了兩種xml的解析技術:DOM和Sax

  1. dom解析技術是W3C組織制定的,而所有的編程語言都對這個解析技術使用了自己語言的特點進行實現。Java對dom技術解析也做了實現
  2. sun公司在JDK5版本對dom解析技術進行升級:SAX(Simple API for XML)解析,它是以類似事件機制通過回調告訴用戶當前正在解析的內容。是一行一行地讀取xml文件進行解析的,不會創建大量的dom對象。所以它在解析xml的時候,在性能上由於Dom解析

這兩種技術已經過時,簡單瞭解即可

  • 第三方的XML解析技術
  1. jdom在dom基礎上進行了封裝
  2. dom4j 又對 jdom進行了封裝
  3. pull主要用在Android手機開發,跟sax非常類似,都是事件機制解析xml文件

4.2dom4j介紹

  1. dom4j是一個簡單、靈活的開放源代碼的庫(用於解析/處理xml文件)。dom4j是由早期開發JDOM的人分離出來後獨立開發的。

  2. 與JDOM不同的是,dom4j使用介面和抽象基類,雖然dom4j的API相對要複雜一些,但他提供了比JDOM更好的靈活性

  3. Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟體採用的dom4j

  4. 使用dom4j開發,需要下載dom4j對象的jar文件

    dom4j的jar包下載地址(內有使用案例):dom4j

官方api文檔:Overview (dom4j 1.6.1 API)

4.3dom4j獲得document對象的方式

開發dom4j要導入dom4j的jar包

DOM4j中,獲得document對象的方式有三種:

  1. 讀取XML文件,獲得document對象

    SAXReader reader = new SAXReader();//創建一個解析器
    Document document = reader.read(new File("src/input.xml"));//XML Document
    
  2. 解析XML形式的文本,得到document對象

    String text = "<members></members>";//直接對一個字元串的xml文本進行解析
    Document document = DocumentHelper.parseText(text);
    
  3. 主動創建document對象

    Document document = DocumentHelper.createDocument();//創建根節點
    Element root = document.addElement("members");
    

下麵只演示方式一的使用:讀取XML文件,獲得document對象

dom4j應用實例-讀取XML文件,獲得document對象

  1. 使用dom4j對students.xml文件進行增刪改查

    • 重點講解查詢(遍歷和指定查詢)
    • xml增刪改使用少,作為拓展,給出案例
  2. 引入dom4j的依賴的jar包

    image-20221103195659085
  3. 在src文件下創建Dom4j_類以及students.xml文件

students.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="01">
        <name>小龍女</name>
        <gender>女</gender>
        <age>16</age>
        <resume>古墓派掌門人</resume>
    </student>
    <student id="02">
        <name>歐陽鋒</name>
        <gender>男</gender>
        <age>18</age>
        <resume>白駝山弟子</resume>
    </student>
</students>

Dom4j_.java:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;

import java.io.File;

public class Dom4j_ {
    /**
     * 演示如何載入xml文件
     */
    @Test
    public void loadXML() throws DocumentException {
        //得到一個解析器
        SAXReader reader = new SAXReader();
        //debug-->看看document對象的屬性
        Document document = reader.read(new File("src/students.xml"));
        System.out.println(document);
    }
}
  1. 如下:在Document document=reader.read(new File("src/students.xml"));處打上斷點:

    image-20221103201218706

  2. 點擊debug,點擊step over,可以看到document對象,它代表整個文檔。

    展開document對象,rootElement代表的就是students根元素

    image-20221103201712970

  3. rootElement下麵有一個content屬性,content屬性存儲著所有的elementData

    image-20221103201920500
  4. 點擊elementData屬性,可以看到該屬性有5個對象:

    image-20221103202217069

    和html-dom解析一樣,這五個對象中有三個是換行符號\n,其餘的兩個才是根元素下麵的子元素student

  5. 點擊展開索引為1的元素對象(即student元素),可以看到該元素對象中又包含了9個對象,除了換行符之外,其餘的對象就是student元素的子元素,name節點,gender節點,age節點和resume節點

    image-20221103202747527

    image-20221103202811647 image-20221103203035733
  6. 點擊name節點,展開,即可看到name節點的值

    image-20221103203823692

document對象的整體結構為:

image-20221103205514813

1.方式一遍歷

演示案例1:遍歷xml指定元素

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;

import java.io.File;
import java.util.List;

public class Dom4j_ {
    /**
     * 遍歷所有的student信息
     */
    @Test
    public void listStus() throws DocumentException {
        //得到一個解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        //2.得到rootElement的student節點
        List<Element> students = rootElement.elements("student");
        System.out.println(students.size());//2
        for (Element student : students) {//student就是student節點/元素
            //獲取student節點的name節點
            Element name = student.element("name");//因為name只有一個,這裡用element方法
            Element age = student.element("age");
            Element gender = student.element("gender");
            Element resume = student.element("resume");
            System.out.println("學生信息=" + name.getText() + " " +
                    age.getText() + " " + gender.getText() + " " + resume.getText());
        }
    }
}
image-20221103212245860
2.方式一查詢

案例2:讀取指定xml元素

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.testng.annotations.Test;

import java.io.File;

public class Dom4j_ {
    /**
     * 指定讀取第一個學生的信息
     */
    @Test
    public void readOne() throws DocumentException {
        //得到一個解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        //2.獲取第一個學生
        Element student = (Element) rootElement.elements("student").get(0);
        //3.輸出該學生的信息
        System.out.println("學生信息=" +
                student.element("name").getText() + " " +
                student.element("age").getText() + " " +
                student.element("gender").getText() + " " +
                student.element("resume").getText());

        //4.獲取student元素的屬性
        System.out.println("id="+student.attributeValue("id"));     
    }
}
image-20221103212637269
3.方式一增刪改

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要記錄 Vue.js 中的 Vuex,Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。 ...
  • 當我們使用vuex的時候,時不時能看到“更改Vuex中的store中的狀態唯一辦法就是提交mutations”,但是有沒有試想過,我們不提交mutations其實也能修改state的值?答案是可以的 我們可以直接使用如下方式; this.$store.state.num=666; 其中,這樣修改的話 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 for in 和 for of 相對於大家肯定都不陌生,都是用來遍歷屬性的沒錯。那麼先看下麵的一個例子: 例1 const obj = { a: 1, b: 2, c: 3 } for (let i in obj) { console.l ...
  • 一、Yarn 產生的背景 Hadoop2 之前是由 HDFS 和 MR 組成的,HDFS 負責存儲,MR 負責計算。 一)MRv1 的問題 耦合度高:MR 中的 jobTracker 同時負責資源管理和作業控制兩個功能,互相制約。 可靠性差:管理節點是單機的,有單點故障的問題。 資源利用率低:基於 ...
  • 面向對象 一、三大特征之繼承 python三大特征: 封裝、繼承、多態 三者中繼承最為核心,實際應用多,感受較為直觀 封裝和多態略微抽象 1、繼承的概念 繼承的含義: ​ 在現實生活中,繼承表示人與人之間資源的從屬關係 ​ 例如:兒子繼承父親 ​ 在編程的世界中,繼承表示類與類之間的資源從屬關係 ​ ...
  • 熱度已經過了,但還是覺得有必要從架構設計的角度來討論一下此事。並用以往我的經驗來設計一套負載能力更好一些的系統。 先說一下基本的架構思路: 最大限度的避免計算,靜態化 不用資料庫,更新類操作使用APPEND模式的文本文件 流程最短,最好是客戶端訪問的第一臺伺服器就能完成全部工作 善用CDN 客戶端負 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 從之前的Lambda表達式的演變過程可以知道,Lambda表達式其實是一個對匿名內部類的簡化過程:去掉了多餘的語法修飾,只保留最最核心的部分。在Java中類似這種使用匿名內部類寫代碼的場景非常多,比如Runnable介面,就是典型的最好使用La ...
  • 本節內容會用到之前給大家講過的這兩篇: 2流高手速成記(之六):從SpringBoot到SpringCloudAlibaba 2流高手速成記(之三):SpringBoot整合mybatis/mybatis-plus實現數據持久化 鏈接掛出來,方便咱們中途對比著看 老規矩,先放出本節的項目結構: 我們 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...