XML 序列化與操作詳解筆記

一、XML 基礎概念

XML(eXtensible Markup Language,可擴展標記語言)是一種用于存儲和傳輸數據的標記語言,由 W3C 制定,具有以下特點:

  • 可擴展性:允許自定義標記(如<Student><StuName>),而非固定標簽集;

  • 跨平臺:獨立于編程語言和操作系統,適合不同系統間的數據交換;

  • 用途:主要用于數據存儲和傳輸(如配置文件、WebService 數據交互),與 HTML(用于數據展示)形成互補。

二、XML 文檔格式與語法要求

XML 有嚴格的格式規范,不符合規范的文檔會被視為無效:

1. 格式要求

  • 唯一根元素:整個文檔必須有且僅有一個根元素(所有其他元素都嵌套在其內部);

  • 標簽匹配:每個開始標簽(如<Student>)必須有對應的結束標簽(</Student>);

  • 正確嵌套:元素不能交叉嵌套(如<a><b></a></b>是錯誤的);

  • 屬性規范:屬性值必須用引號(單引號或雙引號)括起,且同一元素中屬性不能重復。

2. 核心語法

  • 處理指令

    :聲明 XML 版本和編碼(通常位于文檔開頭),如:

    <?xml version="1.0" encoding="utf-8" ?>
  • 元素

    :由開始標簽、內容、結束標簽組成,如:

    <StuName>高啟強</StuName> ?<!-- 內容為文本 -->
  • 屬性

    :元素的附加信息,格式為屬性名="值",如:

    <Version versionNum="2.1" pTime="2023-03-28">數據版本信息</Version>
  • 注釋

    :以<!--開頭,-->結尾,如:

    <!-- 這是一個學生信息的XML文檔 -->

三、XML 序列化與反序列化

XML 序列化是將對象轉換為 XML 格式的過程,反序列化則是將 XML 還原為對象的過程,主要通過XmlSerializer類實現。

1. 核心工具

  • XmlSerializer:位于System.Xml.Serialization命名空間,負責對象與 XML 的相互轉換。

2. 序列化步驟

  1. 定義實體類:需序列化的類(無需特殊特性標記);

  2. 創建文件流:通過FileStream指定 XML 文件路徑和模式(如FileMode.Create創建文件);

  3. 實例化序列化器XmlSerializer需指定對象類型(如typeof(People));

  4. 執行序列化:調用Serialize()方法,將對象寫入 XML 文件;

  5. 釋放資源:關閉文件流和寫入器。

3. 反序列化步驟

  1. 創建文件流:通過FileStream打開已有的 XML 文件;

  2. 實例化序列化器:與序列化時的類型一致;

  3. 執行反序列化:調用Deserialize()方法,將 XML 內容轉換為對象;

  4. 釋放資源:關閉文件流和讀取器。

4. 示例代碼

using System.IO;
using System.Xml.Serialization;
?
// 1. 定義實體類
public class People
{public string Name { get; set; }public int Age { get; set; }public string Sex { get; set; }public string Birth { get; set; }
}
?
// 2. 序列化:對象 → XML
public void XmlSerialize()
{People people = new People(){Name = "吳亦凡",Age = 18,Sex = "男",Birth = "2005-01-01"};
?// 創建文件流和寫入器using (FileStream fs = new FileStream("people.xml", FileMode.Create))using (StreamWriter sw = new StreamWriter(fs)){XmlSerializer serializer = new XmlSerializer(typeof(People));serializer.Serialize(sw, people); ?// 序列化并寫入XML}
}
?
// 3. 反序列化:XML → 對象
public void XmlDeserialize()
{// 創建文件流和讀取器using (FileStream fs = new FileStream("people.xml", FileMode.Open))using (StreamReader sr = new StreamReader(fs)){XmlSerializer serializer = new XmlSerializer(typeof(People));People people = serializer.Deserialize(sr) as People; ?// 反序列化為對象Console.WriteLine($"姓名:{people.Name},年齡:{people.Age}");}
}

生成的people.xml內容示例:

<?xml version="1.0" encoding="utf-8"?>
<People xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Name>吳亦凡</Name><Age>18</Age><Sex>男</Sex><Birth>2005-01-01</Birth>
</People>

四、XML 文件的生成與讀取

除了通過序列化生成 XML,還可手動創建 XML 文件,或通過XmlDocument類讀取已有 XML。

1. 手動生成 XML 文件

通過文本編輯器直接編寫,需遵循 XML 格式規范。例如學生信息 XML(XMLFile1.xml):

<?xml version="1.0" encoding="utf-8" ?>
<Students> ?<!-- 根元素 --><Student> ?<!-- 子元素 --><StuName>高啟強</StuName><StuAge>48</StuAge><StuGender>男</StuGender><StuClass>C#一班</StuClass></Student><Student><StuName>孟鈺</StuName><StuAge>16</StuAge><StuGender>女</StuGender><StuClass>C#一班</StuClass></Student><DataInfo> ?<!-- 其他子元素 --><Version versionNum="2.1" pTime="2023-03-28">數據版本信息</Version></DataInfo>
</Students>

2. 讀取 XML 文件(使用 XmlDocument

XmlDocument 是用于操作 XML 文檔的核心類,可加載 XML 并遍歷節點獲取數據。

常用對象與方法
對象屬性 / 方法說明
XmlDocumentLoad(string path)加載指定路徑的 XML 文件
DocumentElement獲取 XML 的根節點
XmlNodeName獲取節點名稱(如 "Student")
InnerText獲取節點的文本內容
ChildNodes獲取當前節點的所有子節點
讀取示例代碼
using System.Xml;
using System.Collections.Generic;
?
// 定義學生類
public class Student
{public string StuName { get; set; }public int StuAge { get; set; }public string StuGender { get; set; }public string StuClass { get; set; }
}
?
// 讀取XML并轉換為學生列表
private void ReadXml()
{// 1. 創建XML文檔對象XmlDocument xmlDoc = new XmlDocument();// 2. 加載XML文件(路徑根據實際情況調整)xmlDoc.Load("XMLFile1.xml");// 3. 獲取根節點(<Students>)XmlNode rootNode = xmlDoc.DocumentElement;
?List<Student> students = new List<Student>();
?// 4. 遍歷根節點的所有子節點foreach (XmlNode node in rootNode.ChildNodes){// 只處理<Student>節點if (node.Name == "Student"){Student student = new Student();// 遍歷<Student>的子節點(如<StuName>、<StuAge>)foreach (XmlNode childNode in node.ChildNodes){switch (childNode.Name){case "StuName":student.StuName = childNode.InnerText; ?// 獲取節點內容break;case "StuAge":student.StuAge = int.Parse(childNode.InnerText);break;case "StuGender":student.StuGender = childNode.InnerText;break;case "StuClass":student.StuClass = childNode.InnerText;break;}}students.Add(student);}}
?// 輸出結果foreach (var stu in students){Console.WriteLine($"姓名:{stu.StuName},年齡:{stu.StuAge},班級:{stu.StuClass}");}
}

五、XML 與 JSON 的區別

XML 和 JSON 都是常用的數據交換格式,但各有特點:

對比維度XMLJSON
重量級別重量級(標簽冗余,如<Name></Name>輕量級(簡潔的鍵值對,如"Name":""
帶寬占用較高(冗余標簽多)較低(格式簡潔)
可讀性結構清晰,但標簽較多略顯繁瑣更簡潔,易于人類閱讀
解析方式使用XmlDocumentXmlSerializer內置DataContractJsonSerializer或第三方Newtonsoft.Json
擴展性支持命名空間、注釋,擴展性強不支持注釋,擴展性較弱
適用場景配置文件(如 App.config)、WebService接口數據交互、輕量級存儲

總結

XML 作為一種可擴展的標記語言,在配置文件、跨平臺數據交換(如 WebService)中應用廣泛。通過XmlSerializer可實現對象與 XML 的快速轉換,而XmlDocument則提供了手動操作 XML 節點的能力。與 JSON 相比,XML 更適合需要復雜結構和強擴展性的場景,而 JSON 在輕量級數據交互中更具優勢。

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

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

相關文章

第八十四章:實戰篇:圖 → 視頻:基于 AnimateDiff 的視頻合成鏈路——讓你的圖片“活”起來,瞬間擁有“電影感”!

AI圖生視頻前言&#xff1a;從“剎那永恒”到“動態大片”——AnimateDiff&#xff0c;讓圖片“活”起來&#xff01;第一章&#xff1a;痛點直擊——靜態圖像到視頻&#xff0c;不是“幻燈片”那么簡單&#xff01;第二章&#xff1a;探秘“時間魔法”&#xff1a;AnimateDiff…

2025深大計算機考研復試經驗貼(已上岸)

如果你在初試出分前看到此貼 我建議&#xff1a; 準備機試和簡歷&#xff0c;即使你不估分&#xff1a;因為如果要準備春招的話&#xff0c;也總要刷題和做簡歷的。盡早估分&#xff0c;查一下往年的復試線&#xff0c;如果有望進復試&#xff0c;可盡早開始準備。 Preface …

用Pygame開發桌面小游戲:從入門到發布

一、引言 Pygame是一個基于Python的跨平臺游戲開發庫,它提供了簡單易用的圖形、聲音和輸入處理功能,非常適合新手入門游戲開發。本文將以"經典游戲合集"項目為例,帶你一步步了解如何使用Pygame開發、打包和發布自己的桌面小游戲。 二、開發環境搭建 安裝Python:…

CSS backdrop-filter:給元素背景添加模糊與色調的高級濾鏡

在現代網頁設計中&#xff0c;半透明元素搭配背景模糊效果已成為流行趨勢 —— 從毛玻璃導航欄、模態框遮罩&#xff0c;到卡片懸停效果&#xff0c;這種設計能讓界面更具層次感和高級感。實現這一效果的核心 CSS 屬性&#xff0c;正是backdrop-filter。它能對元素背后的內容&a…

檢索增強生成(RAG) 緩存增強生成(CAG) 生成中檢索(RICHES) 知識庫增強語言模型(KBLAM)

以下是當前主流的四大知識增強技術方案對比&#xff0c;涵蓋核心原理、適用場景及最新發展趨勢&#xff0c;為開發者提供清晰的技術選型參考&#xff1a; &#x1f50d; 一、RAG&#xff08;檢索增強生成&#xff09;?? 核心原理?&#xff1a; 動態檢索外部知識庫&#xff0…

LLM(大語言模型)的工作原理 圖文講解

目錄 1. 條件概率&#xff1a;上下文預測的基礎 2. LLM 是如何“看著上下文寫出下一個詞”的&#xff1f; 補充說明&#xff08;重要&#xff09; &#x1f4cc; Step 1: 輸入處理 &#x1f4cc; Step 2: 概率計算 &#x1f4cc; Step 3: 決策選擇 &#x1f914; 一個有…

Python netifaces 庫詳解:跨平臺網絡接口與 IP 地址管理

一、前言 在現代網絡編程中&#xff0c;獲取本機的網絡接口信息和 IP 配置是非常常見的需求。 例如&#xff1a; 開發一個需要選擇合適網卡的 網絡服務&#xff1b;在多網卡環境下實現 流量路由與控制&#xff1b;在系統診斷工具中展示 IP/MAC 地址、子網掩碼、默認網關&#x…

HTML應用指南:利用POST請求獲取上海黃金交易所金價數據

上海黃金交易所&#xff08;SGE&#xff09;作為中國唯一經國務院批準、專門從事黃金等貴金屬交易的國家級市場平臺&#xff0c;自成立以來始終秉持“公開、公平、公正”的原則&#xff0c;致力于構建規范、高效、透明的貴金屬交易市場體系。交易所通過完善的交易機制、嚴格的風…

C++常見面試題-1.C++基礎

一、C 基礎 1.1 語言特性與區別C 與 C 的主要區別是什么&#xff1f;C 為何被稱為 “帶類的 C”&#xff1f; 主要區別&#xff1a;C 引入了面向對象編程&#xff08;OOP&#xff09;特性&#xff08;類、繼承、多態等&#xff09;&#xff0c;而 C 是過程式編程語言&#xff1…

Tomcat里catalina.sh詳解

在 Tomcat 中&#xff0c;catalina.sh&#xff08;Linux/macOS&#xff09;或 catalina.bat&#xff08;Windows&#xff09;是 核心的啟動和關閉腳本&#xff0c;用于控制 Tomcat 服務器的運行。它是 Tomcat 的“主控腳本”&#xff0c;負責設置環境變量、啟動/關閉 JVM 進程&…

STM32之MCU和GPIO

一、單片機MCU 1.1 單片機和嵌入式 嵌入式系統 以計算機為核心&#xff0c;tips&#xff1a;計算機【處理單元&#xff0c;內存 硬盤】 可以控制的外部設備&#xff0c;傳感器&#xff0c;電機&#xff0c;繼電器 嵌入式開發 數據源--> 處理器(CPU MCU MPU) --> 執行器 …

22_基于深度學習的桃子成熟度檢測系統(yolo11、yolov8、yolov5+UI界面+Python項目源碼+模型+標注好的數據集)

目錄 項目介紹&#x1f3af; 功能展示&#x1f31f; 一、環境安裝&#x1f386; 環境配置說明&#x1f4d8; 安裝指南說明&#x1f3a5; 環境安裝教學視頻 &#x1f31f; 二、數據集介紹&#x1f31f; 三、系統環境&#xff08;框架/依賴庫&#xff09;說明&#x1f9f1; 系統環…

數據結構:二叉樹oj練習

在講今天的題目之前&#xff0c;我們還需要講一下二叉樹的以下特點&#xff1a; 對任意一顆二叉樹&#xff0c;如果度為0的節點個數是n0&#xff0c;度為2的節點個數是n2&#xff0c;則有n0n21. 證明&#xff1a;二叉樹總的節點個數是n&#xff0c;那么有nn0n1n2 二叉樹的度為…

RabbitMQ高級特性——TTL、死信隊列、延遲隊列、事務、消息分發

目錄 一、TTL 1.1設置消息的TTL 1.2設置隊列的TTL 1.3兩者之間的區別 二、死信隊列 2.1死信的概念 2.2死信產生的條件&#xff1a; 2.3死信隊列的實現 死信隊列的工作原理 2.4常??試題 三、延遲隊列 3.1概念 3.2應用場景 3.3RabbitMQ 實現延遲隊列的核心原理 1…

神經網絡設計中關于BN歸一化(Normalization)的討論

在神經網絡的結構中&#xff0c;我們常常可以看見歸一化&#xff08;Normalization&#xff09;如BN的出現&#xff0c;無論是模型的backbone或者是neck的設計都與它有著重大的關系。 因此引發了我對它的思考&#xff0c;接下來我將從 是什么&#xff08;知識領域&#xff0c;誕…

MacOS 安全機制與“文件已損壞”排查完整指南

1. 背景說明macOS 為了保護系統安全&#xff0c;內置了多個安全機制&#xff1a;機制作用是否影響第三方 AppSIP (System Integrity Protection)保護系統關鍵文件/目錄不被篡改高風險 App/驅動可能受限Gatekeeper限制未簽名/未認證 App 運行阻止“未知開發者” App文件隔離屬性…

package.json文件中的devDependencies和dependencies對象有什么區別?

前端項目的package.json文件中&#xff0c;dependencies和devDependencies對象都用于指定項目所依賴的軟件包&#xff0c;但它們在項目的開發和生產環境中的使用有所不同。1.dependencies&#xff1a;dependencies是指定項目在生產環境中運行所需要的依賴項。這些依賴項通常包括…

【最新版】CRMEB Pro版v3.4系統源碼全開源+PC端+uniapp前端+搭建教程

一.系統介紹 crmebPro版 v3.4正式發布&#xff0c;智能任務推送、動態標簽管理、商城AI生產力&#xff0c;煥然一新&#xff0c;不負期待&#xff01;頁面DIY設計功能全面升級&#xff0c;組件更豐富&#xff0c;樣式設計更全面&#xff1b;移動端商家管理&#xff0c;讓商城管…

AI 浪潮下 IT 從業者的職業展望:替代之惑與轉型之道

一、引言1.1 科技變革的浪潮&#xff1a;AI 崛起與 IT 行業震蕩在當今科技飛速發展的時代&#xff0c;人工智能&#xff08;AI&#xff09;無疑是最具影響力的變革力量之一。從實驗室的前沿研究到廣泛的商業應用&#xff0c;AI 以驚人的速度滲透到各個領域&#xff0c;徹底改變…

DSP音頻算法移植優化工程師實戰

以下以音頻FIR濾波器算法為例&#xff0c;完整演示從MATLAB原型 → Python驗證 → TI DSP C語言移植優化的全流程&#xff0c;包含關鍵代碼和優化技巧&#xff1a;關鍵優化技術解析&#xff1a; 內存訪問優化使用#pragma DATA_ALIGN確保64位對齊&#xff08;滿足LDDW指令要求&a…