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

C# XML 使用教程

C# XML 使用教程

目录

  • C# XML 使用教程
    • XML 是什么
      • 介绍
      • 组成
      • XML 与 HTML 的区别
    • C# 中如何使用 XML
      • 序列化
        • 根元素
        • 子元素
        • 序列化方法
      • 反序列化
        • 反序列化方法
    • 序列化与反序列化实例

XML 是什么

介绍

  • 可扩展标记语言 (Extensible Markup Language, XML) ,标准通用标记语言的子集,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

  • XML 是标准通用标记语言,可扩展性良好、内容与形式分离、遵循严格的语法要求、保值性良好、可读性优等优点。

  • 在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。

  • 它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

组成

  • 声明语句:XML 声明是 XML 文档的第一句,格式如下,version 表示 XML 版本,encoding 表示 XML 编码格式。
<?xml version="1.0" encoding="utf-8"?>
  • 元素:良好格式的 XML 文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。
<?xml version="1.0" encoding="utf-8"?>
<packages><!-- <packages> 是起始标记;</packages> 是结束标记 --><package id="Microsoft.Windows.Shell" version="3.0.1.0" targetFramework="net40" /><package></package> <package /> <!-- <package></package> 等同于 <package />,起始标记和结束标记之间没有内容时可以替换 -->
</packages>
  • 区分大小写:在XML文档中,大小写是有区别的。'A’和’a’是不同的标记。注意在写元素时,前后标记的大小写要保持一致。

  • 命名空间:在下方的 XML 中,除开manifest 外,manifest 元素起始标记中的所有都属于命名空间。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="osg.AndroidExample"android:installLocation="preferExternal"android:versionCode="1"android:versionName="1.0">
</manifest>
  • 属性值使用引号:XML 规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

  • 所有的标记必须有相应的结束标记:所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。空标记是指标记对之间没有内容的标记,同样,空标记也要有结束标记。

XML 与 HTML 的区别

  • 可扩展性方面:HTML 不允许用户自行定义自己的标识或属性,而在 XML 中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。

  • 结构性方面:HTML 不支持深层的结构描述,XML 的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。

  • 可校验性方面:HTML 没有提供规范文件以支持应用软件对 HTML 文件进行结构校验,而 XML 文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。

C# 中如何使用 XML

  • 在 C# 中可以将类对像序列化成 XML 文本进行传输;接收到 XML 文本再转换成 对应的类对象。

序列化

  • 首先添加 XML、Xml.Serialization 的引用
using System.Xml;
using System.Xml.Serialization;
  • 以 MessageDataXml 类来测试,目标是将 MessageDataXml 类对象转换成 XML 文本
根元素
  • 根元素是 MessageDataXml,设定元素是 MessageData。类的空构造函数记得添加。
[XmlRoot("MessageData")]
public class MessageDataXml
{public MessageDataXml(){}
}
子元素
  • 子元素有 Label、FunctionName、Type、Key、Equipment、ReplyQueue、ReturnCode、ReturnMessage、ContentXml,设定元素分别是 Label、FunctionName、Type、Key、Equipment、ReplyQueue、ReturnCode、ReturnMessage、Content。
[XmlElement("Label")]
public string Label { get; set; }...[XmlElement("Content")]public Content ContentXml { get; set; }
  • Content 这个子元素是一个类,所以需要添加 一个 MessageDataXml 的内部类 Content。

  • 同样,子元素 Content 的子元素 GetLotInfoDataXml 也是一个类,所以需要添加 一个 Content 的内部类 GetLotInfoDataXml。

  • 下面是MessageDataXml 全部的元素和标记命名

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;namespace MSMQ
{[XmlRoot("MessageData")]public class MessageDataXml{[XmlInclude(typeof(Content))]public class Content{[XmlElement("GetLotInfoData")]public GetLotInfoData GetLotInfoDataXml { get; set; }public Content(){}[XmlInclude(typeof(GetLotInfoData))]public class GetLotInfoData{[XmlElement("Lot")]public string Lot { get; set; }[XmlElement("ErpLot")]public string ErpLot { get; set; }public GetLotInfoData(){}}}[XmlElement("Label")]public string Label { get; set; }[XmlElement("FunctionName")]public string FunctionName { get; set; }[XmlElement("Type")]public string Type { get; set; }[XmlElement("Key")]public string Key { get; set; }[XmlElement("Equipment")]public string Equipment { get; set; }[XmlElement("ReplyQueue")]public string ReplyQueue { get; set; }[XmlElement("ReturnCode")]public string ReturnCode { get; set; }[XmlElement("ReturnMessage")]public string ReturnMessage { get; set; }[XmlElement("Content")]public Content ContentXml { get; set; }public MessageDataXml(){}}
序列化方法
  • XmlWriterSettings 是 XML 格式设定类;MemoryStream 是内存流对象;XmlSerializerNamespaces 是 XML 命名空间设定类;XmlWriter 是 XML 写入器,用来生成 XML 文本。
/// <summary>
/// 将 MessageDataXml 序列化成 XML 字符串
/// </summary>
/// <param name="encoding">字符编码格式</param>
/// <returns>XML 字符串</returns>
public string SerializeToXML(Encoding encoding)
{XmlWriterSettings settings = new XmlWriterSettings {// 保留 xml 声明OmitXmlDeclaration = false,Encoding = encoding,// 换行缩进Indent = true};MemoryStream mem = new MemoryStream();using (XmlWriter writer = XmlWriter.Create(mem, settings)){//去除默认命名空间xmlns:xsd和xmlns:xsiXmlSerializerNamespaces ns = new XmlSerializerNamespaces();ns.Add("", "");XmlSerializer serializer = new XmlSerializer(typeof(MessageDataXml));serializer.Serialize(writer, this, ns);}return encoding.GetString(mem.ToArray());
}
  • 序列化方法也可以改成 泛型 方法,方便复用
/// <summary>
/// 将 类对象序列化成 XML 字符串
/// </summary>
/// /// <typeparam name="T">类泛型</typeparam>
/// <param name="t">类对象</param>
/// <param name="encoding">字符编码格式</param>
/// <returns>XML 字符串</returns>
public static string XMLConvert<T>(T t, Encoding encoding)
{XmlWriterSettings settings = new XmlWriterSettings {// 保留 xml 声明,这个 <?xml version="1.0" encoding="utf-8"?>OmitXmlDeclaration = false,Encoding = encoding,// 换行缩进Indent = true};MemoryStream mem = new MemoryStream();using (XmlWriter writer = XmlWriter.Create(mem, settings)){//去除默认命名空间xmlns:xsd和xmlns:xsiXmlSerializerNamespaces ns = new XmlSerializerNamespaces();ns.Add("", "");XmlSerializer serializer = new XmlSerializer(typeof(T));serializer.Serialize(writer, t, ns);}return encoding.GetString(mem.ToArray());
}

反序列化

  • 同样添加 XML、Xml.Serialization、IO 的引用
using System.Xml;
using System.Xml.Serialization;
using System.IO;
反序列化方法
  • XmlWriterSettings 是 XML 格式设定类;MemoryStream 是内存流对象;XmlTextReader 是 XML 读取器。
/// <summary>
/// 将 XML 字符串反序列化成 MessageDataXml 类
/// </summary>
/// <param name="xml">XML 字符串</param>
/// <param name="encoding">字符串编码格式</param>
/// <returns>MessageData 类</returns>
public static MessageDataXml DeserializeFromXML(string xml, Encoding encoding)
{XmlSerializer serializer = new XmlSerializer(typeof(MessageDataXml));// 根据指定编码格式获取 XML 文本byte[] byteArray = encoding.GetBytes(xml);MemoryStream memoryStream = new MemoryStream(byteArray);using (StreamReader streamReader = new StreamReader(memoryStream, encoding)){// 防止XML外部实体攻击using (XmlTextReader xmlReader = new XmlTextReader(streamReader) { XmlResolver = null }){xmlReader.Normalization = false;return (MessageDataXml) serializer.Deserialize(xmlReader);}}
}
  • 反序列化方法也可以改成 泛型 方法,方便复用
/// <summary>
/// 将 XML 字符串反序列化成 类对象
/// </summary>
/// <typeparam name="T">类泛型</typeparam>
/// <param name="xml">XML 字符串</param>
/// <param name="encoding">字符串编码格式</param>
/// <returns>泛型 T</returns>
public static T ParseXml<T>(string xml, Encoding encoding)
{XmlSerializer serializer = new XmlSerializer(typeof(T));byte[] byteArray = encoding.GetBytes(xml);MemoryStream memoryStream = new MemoryStream(byteArray);using (StreamReader streamReader = new StreamReader(memoryStream, encoding)){// 防止XML外部实体攻击using (XmlTextReader xmlReader = new XmlTextReader(streamReader) { XmlResolver = null }){xmlReader.Normalization = false;return (T) serializer.Deserialize(xmlReader);}}
}

序列化与反序列化实例

// 创建一个 MessageDataXml,然后序列化成 XML 文本
Guid newGuid = Guid.NewGuid();
MessageDataXml.Content.GetLotInfoData getLotInfoDataXml = new MessageDataXml.Content.GetLotInfoData {Lot = "Lot_112233"
};
MessageDataXml.Content contentXml = new MessageDataXml.Content {GetLotInfoDataXml = getLotInfoDataXml
};
MessageDataXml messageDataXml = new MessageDataXml("queueName_001", newGuid.ToString(), "equ_001", "path_001", contentXml);
string s1 = messageDataXml.SerializeToXML(Encoding.Unicode);
string s2 = MessageDataXml.XMLConvert<MessageDataXml>(messageDataXml, Encoding.Unicode);// 创填入 XML 文本,反序列化成 MessageDataXml 类对象
MessageDataXml messageDataXml = MessageDataXml.DeserializeFromXML(s1, Encoding.Unicode);
MessageDataXml messageDataXml1 = MessageDataXml.ParseXml<MessageDataXml>(s2, Encoding.Unicode);
  • 最终结果
<MessageData><Label>2024/08/30 3:28:28</Label><FunctionName></FunctionName><Type>Request</Type><Key>4a2e99ef-5249-4b9c-ac6a-e3491a80fcdc</Key><Equipment>equ_001</Equipment><ReplyQueue>path_001</ReplyQueue><ReturnCode>000000</ReturnCode><ReturnMessage /><Content><GetLotInfoData><Lot>Lot_112233</Lot></GetLotInfoData></Content>
</MessageData>

相关文章:

C# XML 使用教程

C# XML 使用教程 目录 C# XML 使用教程XML 是什么介绍组成XML 与 HTML 的区别 C# 中如何使用 XML序列化根元素子元素序列化方法 反序列化反序列化方法 序列化与反序列化实例 XML 是什么 介绍 可扩展标记语言 (Extensible Markup Language, XML) &#xff0c;标准通用标记语言的…...

淘宝开放平台交易类API解析以及如何测试?

调用淘宝开放平台的订单接口&#xff0c;主要可以通过以下几种途径进行&#xff1a; 1. 直接使用淘宝开放平台提供的API接口 步骤概述&#xff1a; 注册淘宝开放平台账号&#xff1a;首先&#xff0c;你需要在淘宝开放平台注册一个开发者账号。创建应用&#xff1a;在注册并…...

基于聚类与LSTM对比特币价格深度分析与预测

1.项目背景 比特币作为全球最具影响力的加密货币之一&#xff0c;其价格受到多种复杂因素的共同作用&#xff0c;包括市场情绪、政策变化、大型机构的投资行为等&#xff0c;这些因素在不同的市场阶段对比特币价格波动产生直接或间接的影响。通过对比特币市场的深入分析&#…...

YOLOv9改进策略【Neck】| 使用CARAFE轻量级通用上采样算子

一、本文介绍 本文记录的是利用CARAFE上采样对YOLOv9的颈部网络进行改进的方法研究。YOLOv9采用传统的最近邻插值的方法&#xff0c;仅考虑子像素邻域&#xff0c;无法捕获密集预测任务所需的丰富语义信息&#xff0c;从而影响模型在密集预测任务中的性能。CARAFE通过在大感受…...

SpringMVC上

SpringMVC介绍 MVC模型 MVC全称Model View Controller&#xff0c;是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分&#xff1a; Model&#xff08;模型&#xff09;&#xff1a;指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用…...

嵌入式软件--51单片机 DAY 2

一、数码管 1.数码管概况 2.设计 &#xff08;1&#xff09;硬件设计 我们可以通过阴极控制显示的位置&#xff0c;通过阳极控制显示的内容。两个数码管共有8个阴极引脚和16个阳极引脚&#xff0c;如果所有引脚都直接接入MCU&#xff0c;会造成MCU引脚的极大浪费。 为了节省…...

高精度加法,减法,乘法,除法

加法&#xff1a; 大整数该如何储存&#xff1f; 用数组储存&#xff1a; 把个位放在数下标为0的位置&#xff0c;十位放在数组下标为1的位置&#xff08;也就是高位放在数组的后面&#xff09; 因为这样&#xff0c;如果需要增加一位最高位&#xff0c;那我们就可以直接在…...

学习计划(大三上)

第二周 总结Java并发编程的艺术 学习JVM&#xff08;博客文章&#xff09; 第三周 学习JVM&#xff08;博客文章&#xff09; 图解TCP/IP 4章 第四周 完成简历项目 学习JVM&#xff08;博客文章&#xff09; 图解TCP/IP 4章 第五周 完成简历项目 深入学习RocketMQ底层…...

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——10.继承

1.继承的概念及定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保 持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象 程序设计的层…...

uniapp+vue3实现双通道透明MP4播放支持小程序和h5

双通道透明MP4视频播放的截图 以下是合成后结果&#xff0c;二个合并在一起进行播放 下载资源&#xff0c;打开运行直接使用看到效果 https://download.csdn.net/download/qq_40039641/89715780...

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识&#xff0c;包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站&#xff0c;可以帮助你深入学习嵌入式软件架构设计&#xff1a; ### 1. **Embedded.com** - **网址**: [Embedded.com](htt…...

python编程知识(实现数据加密和解密)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

如何使div居中?CSS居中终极指南

前言 长期以来&#xff0c;如何在父元素中居中对齐一个元素&#xff0c;一直是一个让人头疼的问题&#xff0c;随着 CSS 的发展&#xff0c;越来越多的工具可以用来解决这个难题&#xff0c;五花八门的招式一大堆&#xff0c;这篇博客&#xff0c;旨在帮助你理解不同的居中方法…...

Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 本章目录 1.0 基于 Redis 实现的分布式锁存在的问题 2.0 Redisson 功能概述 3.0 Redisson 具体使用 4.0 Redisson 可重入锁原理 5.0 Redisson 锁重试原理 6.0 Redisson WatchDo…...

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统&#xff0c;以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面&#xff0c;PostgreSQL采用了多版本并发控制&#xff08;MVCC&#xff09;机制&#xff0c;该机制为数据库提供了高效的数据访问和更新能力…...

SpringBoot项目-实现简单的CRUD功能和分页查询

背景 本博文主要是创建了一个新的SpringBoot项目&#xff0c;实现基本的增删改查&#xff0c;分页查询&#xff0c;带条件的分页查询功能。是方便初学者学习后端项目的一个比较清晰明了的实践代码&#xff0c;读者可根据博文&#xff0c;从自己动手创建一个新的SpringBoot项目…...

CCF编程能力等级认证GESP—C++2级—20240907

CCF编程能力等级认证GESP—C2级—20240907 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09;判断题&#xff08;每题 2 分&#xff0c;共 20 分&#xff09;编程题 (每题 25 分&#xff0c;共 50 分)数位之和小杨的矩阵 单选题&#xff08;每题 2 分&#xff0c;共…...

C语言手撕实战代码_二叉排序树(二叉搜索树)_构建_删除_插入操作详解

二叉排序树习题1.设计算法构建一棵二叉排序树(又称二叉搜索树BST)2.查找二叉排序树中结点为x的结点所在的层数3.删除二叉排序树T中值为x的结点4.查找二叉排序树中所有小于key的关键字5.编写算法&#xff0c;将一棵二叉树t分解成两棵二叉排序树t1和t2&#xff0c;使得t1中的所有…...

YC教父的创始人模式VS职业经理人模式:AI时代的独立开发者崛起

近年来&#xff0c;由风投资助的创始人模式因其相对较低的入门门槛而在创业圈内广受欢迎。然而&#xff0c;真正的挑战在于独立开发者&#xff08;一人商业&#xff09;模式。随着AI技术的飞速发展&#xff0c;一人商业模式有望成为未来的主流。本文将探讨独立开发者的工作范围…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...