当前位置: 首页 > news >正文

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.lryc.cn/news/625703.html

相关文章:

  • Gemini CLI 自定义主题配置
  • 块存储 对象存储 文件存储的区别与联系
  • es9.0.1语义检索简单示例
  • RNN(循环神经网络)和Transformer是处理自然语言处理(NLP)任务区别
  • 《用Proxy解构前端壁垒:跨框架状态共享库的从零到优之路》
  • 高校数字化转型实战:破解数据孤岛、构建智能指标体系与AI落地路径
  • C++代码解释:实现一个 mystring 类,用于表示字符串,实现构造函数,默认构造长度为 10 的空间,提供打印字符串,获取空间大小,修改内容的成员函数
  • InnoDB为什么使用B+树实现索引?
  • Word——正确调整文字与编号的距离
  • 4.Kotlin 集合 Map 所有方法
  • Linux系统安全补丁管理与自动化部署研究与实现(LW+源码+讲解+部署)
  • Ubuntu 20 各种网卡配置IP的方法
  • pnpm 和 npm 差异
  • MySQL 三大日志:redo log、undo log、binlog 详解
  • Git+Jenkins实战(一)
  • 软件测试核心概念拆解:需求、开发模型与测试模型全解析
  • JVM调优实战指南:从原理到落地的全面优化方案
  • 安装DDNS-go
  • FlexSim-线平衡优化仿真
  • Qt元对象
  • Qt消息队列
  • es7.x es的高亮与solr高亮查询的对比对比说明
  • 使用Tomcat Clustering和Redis Session Manager实现Session共享
  • Auto-CoT:大型语言模型的自动化思维链提示技术
  • 基于“R语言+遥感“水环境综合评价方法技术应用——水线提取、水深提取、水温提、水质提取、水环境遥感等
  • STM32-FreeRTOS快速入门指南(下)
  • LLM 中 token 简介与 bert 实操解读
  • 字符串与算法题详解:最长回文子串、IP 地址转换、字符串排序、蛇形矩阵与字符串加密
  • 基于SpringBoot+Vue的写真馆预约管理系统(邮箱通知、WebSocket及时通讯、协同过滤算法)
  • ProfiNet从站转Modbus TCP网关技术详解