一、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…