一、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. 序列化步驟
定義實體類:需序列化的類(無需特殊特性標記);
創建文件流:通過
FileStream
指定 XML 文件路徑和模式(如FileMode.Create
創建文件);實例化序列化器:
XmlSerializer
需指定對象類型(如typeof(People)
);執行序列化:調用
Serialize()
方法,將對象寫入 XML 文件;釋放資源:關閉文件流和寫入器。
3. 反序列化步驟
創建文件流:通過
FileStream
打開已有的 XML 文件;實例化序列化器:與序列化時的類型一致;
執行反序列化:調用
Deserialize()
方法,將 XML 內容轉換為對象;釋放資源:關閉文件流和讀取器。
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 并遍歷節點獲取數據。
常用對象與方法
對象 | 屬性 / 方法 | 說明 |
---|---|---|
XmlDocument | Load(string path) | 加載指定路徑的 XML 文件 |
DocumentElement | 獲取 XML 的根節點 | |
XmlNode | Name | 獲取節點名稱(如 "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 都是常用的數據交換格式,但各有特點:
對比維度 | XML | JSON |
---|---|---|
重量級別 | 重量級(標簽冗余,如<Name></Name> ) | 輕量級(簡潔的鍵值對,如"Name":"" ) |
帶寬占用 | 較高(冗余標簽多) | 較低(格式簡潔) |
可讀性 | 結構清晰,但標簽較多略顯繁瑣 | 更簡潔,易于人類閱讀 |
解析方式 | 使用XmlDocument 、XmlSerializer 等 | 內置DataContractJsonSerializer 或第三方Newtonsoft.Json |
擴展性 | 支持命名空間、注釋,擴展性強 | 不支持注釋,擴展性較弱 |
適用場景 | 配置文件(如 App.config)、WebService | 接口數據交互、輕量級存儲 |
總結
XML 作為一種可擴展的標記語言,在配置文件、跨平臺數據交換(如 WebService)中應用廣泛。通過XmlSerializer
可實現對象與 XML 的快速轉換,而XmlDocument
則提供了手動操作 XML 節點的能力。與 JSON 相比,XML 更適合需要復雜結構和強擴展性的場景,而 JSON 在輕量級數據交互中更具優勢。