XML 工具类

文章目录

    • XML 工具类
      • 1 通常情况下对象和XML可直接调用方法进行序列化。
      • 2 特殊情况
      • 3 补充:处理已有的XML数据

XML 工具类

1 通常情况下对象和XML可直接调用方法进行序列化。

public class XmlHelper
{/// <summary>/// XML转实体/// </summary>/// <typeparam name="T"></typeparam>/// <param name="strXML"></param>/// <returns></returns>public static T DESerializer<T>(string strXML) where T : class{try{using (StringReader sr = new StringReader(strXML)){XmlSerializer serializer = new XmlSerializer(typeof(T));return serializer.Deserialize(sr) as T;}}catch (Exception ex){return null;}}/// <summary>/// 序列化XML/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string XmlSerialize<T>(T obj){using (StringWriter sw = new StringWriter()){XmlSerializer serializer = new XmlSerializer(obj.GetType());serializer.Serialize(sw, obj);sw.Close();return sw.ToString();}}/// <summary>/// 将对象序列化为 Xml文件/// </summary>/// <param name="obj"></param>/// <param name="path">路径中要包含文件名,例如:D:/ReportInfo.xml</param>/// <typeparam name="T"></typeparam>public static void XmlSerializeFile<T>(T obj, string path){XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();namespaces.Add(string.Empty, string.Empty);try{using (StreamWriter writer = new StreamWriter(path)){XmlSerializer serializer = new XmlSerializer(obj.GetType());serializer.Serialize(writer, obj, namespaces);writer.Close();}}catch (Exception ex){throw ex;}}/// <summary>///  序列化XML///  去除掉默认命名空间/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string XmlSerializeNONS<T>(T obj){using (StringWriter sw = new StringWriter()){XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();namespaces.Add(string.Empty, string.Empty);XmlSerializer serializer = new XmlSerializer(obj.GetType());serializer.Serialize(sw, obj, namespaces);sw.Close();return sw.ToString();}}/// <summary>/// 序列化XML/// 去除 XML 声明 和 默认命名空间/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static string XmlSerializeNoHeaderAndNS<T>(T obj){string result = string.Empty;var encode = Encoding.UTF8;XmlWriterSettings setting = new XmlWriterSettings();setting.Encoding = encode;setting.OmitXmlDeclaration = true;XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();namespaces.Add(string.Empty, string.Empty);using (MemoryStream output = new MemoryStream()){using (XmlWriter writer = XmlWriter.Create(output, setting)){XmlSerializer serializer = new XmlSerializer(obj.GetType());serializer.Serialize(writer, obj, namespaces);// 格式化XMlFormatXml(output);result = encode.GetString(output.ToArray());writer.Close();}}return result;}/// <summary>/// 格式化XMl/// </summary>/// <param name="memoryStream"></param>public static void FormatXml(MemoryStream memoryStream){// 将MemoryStream中的数据读取到字符串memoryStream.Position = 0;StreamReader reader = new StreamReader(memoryStream);string xmlContent = reader.ReadToEnd();// 加载XML字符串到XDocumentXDocument doc = XDocument.Parse(xmlContent);// 创建一个新的MemoryStream用于存储格式化后的XMLMemoryStream formattedStream = new MemoryStream();// 使用XmlWriterSettings进行格式化设置XmlWriterSettings settings = new XmlWriterSettings();// 省略 XML 声明settings.OmitXmlDeclaration = true;settings.Indent = true; // 启用缩进settings.IndentChars = "    "; // 设置缩进字符settings.NewLineChars = "\r\n"; // 设置换行字符settings.NewLineHandling = NewLineHandling.Replace; // 在XML文本中使用设置的换行字符// 创建XmlWriter来写入格式化后的XML到新的MemoryStreamusing (XmlWriter writer = XmlWriter.Create(formattedStream, settings)){doc.WriteTo(writer);writer.Flush();}// 将格式化后的数据写回原MemoryStreammemoryStream.SetLength(0); // 清空原MemoryStreamformattedStream.Position = 0;formattedStream.CopyTo(memoryStream);// 关闭和释放资源formattedStream.Dispose();reader.Dispose();}}

2 特殊情况

特殊类型通过下面的小案例来讲解,需要在类上加上注解

    /// <summary>/// 此时生成的XML标签为<Request></Request>/// </summary>[XmlRoot("Request")]public class ReportFilesRequest{public Header Header { get; set; } = new();// 对子标签自定义[XmlElement("Body")] public ReportFilesBody ReportFilesBody { get; set; }}public class ReportFilesBody {// 自定义集合类型// <Students>// 		<Student></Student>// 		<Student></Student>// <Students>[XmlArray("Students"), XmlArrayItem("Student")]public List<Student> Students{ get; set; } = new();}

最终生成的XML结构:

<Request><Header></Header><Body><Students><Student></Student><Student></Student></Students></Body>
</Request>

3 补充:处理已有的XML数据

3.1 通过反序列化方法转化为对象进行处理(见工具类)

3.2 直接操作XML数据

		// 通过节点方式获取// 注意字符串要符合Xml数据规范string result = @"<Request><Header>我是头部</Header><Body><Students><Student>小王</Student><Student>小宋</Student><Student></Student></Students></Body>
</Request>";// 处理返回结果XDocument doc = XDocument.Parse(result);// 取出标签中的值var header = doc.Descendants("Header").FirstOrDefault()?.Value;var student = doc.Descendants("Student").FirstOrDefault()?.Value;// 返回标签var body = doc.Descendants("Body").FirstOrDefault();Console.WriteLine(header);Console.WriteLine(student);Console.WriteLine(body);

控制台输出结果:

我是头部
小王
<Body><Students><Student>小王</Student><Student>小宋</Student><Student></Student></Students>
</Body>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【区块链 + 智慧政务】中国铁塔区块链委托代征开票应用 | FISCO BCOS应用案例

中国铁塔是全球规模最大的通信铁塔基础设施服务提供者。通信塔站址点多面广&#xff0c;业主构成复杂&#xff0c;因此产生海量税务、合同、票据等信息。为进一步提高场租或供电取票的及时性和规范性&#xff0c;严格遵循税务相关的要求&#xff0c;中国铁塔采用国产开源联盟链…

RHCSA —— 第五节 (Linux中执行命令)

目录 一、命令格式 命令 分为两种&#xff1a;内置命令 和 外部命令 选项&#xff1a;指定命令的运行特性&#xff0c;指明要运行命令中的哪一个功能代码。 参数&#xff1a;命令的作用对象&#xff0c;即命令对什么生效。 小技巧 二、ls 命令 &#xff08;list&#xff0…

惠海H5112A降压恒流芯片IC 60V72V80V100V转24V36V48V多路共阳输出景观LED点光源

H5112A是一款外围电路简单的多功能平均电流型LED恒流驱动器&#xff0c;适用于5-90V电压范围的非隔离式大功率恒流LED驱动领域。芯片采用了平均电流模式控制&#xff0c;输出电流精度在士3%;输出电流对输入输出电压以及电感不敏感;芯片内部集成了环路补偿&#xff0c;外围电路更…

CV09_深度学习模块之间的缝合教学(4)--调参

深度学习就像炼丹。炉子就是模型&#xff0c;火候就是那些参数&#xff0c;材料就是数据集。 1.1 参数有哪些 调参调参&#xff0c;参数到底是哪些参数&#xff1f; 1.网络相关的参数&#xff1a;&#xff08;1&#xff09;神经网络网络层 &#xff08;2&#xff09;隐藏层…

Docker_指令篇

Docker 的常用指令 1. 启动docker systemctl start docker2. 关闭docker systemctl stop docker3. 重启docker systemctl restart docker4. 设置自启动 systemctl enable docker5. 查看运行状态 systemctl status docker6. 查看帮助命令 docker pull --help7. 查看镜像 …

XML 解析异常问题解决

问题描述 The parser has encountered more than "64000" entity expansions in this document; this is the limit imposed by the JDK. 在运行 Java 应用程序时&#xff0c;出现了 XML 解析异常。具体表现为&#xff1a; 报错信息显示无法创建 StAX&#xff08;S…

AIGC笔记--基于Stable Diffusion实现图片的inpainting

1--完整代码 SD_Inpainting 2--简单代码 import PIL import torch import numpy as np from PIL import Image from tqdm import tqdm import torchvision from diffusers import AutoencoderKL, UNet2DConditionModel, DDIMScheduler from transformers import CLIPTextMod…

flutter 手写 TabBar

前言&#xff1a; 这几天在使用 flutter TabBar 的时候 我们的设计给我提了一个需求&#xff1a; 如下 Tabbar 第一个元素 左对齐&#xff0c;试了下TabBar 的配置&#xff0c;无法实现这个需求&#xff0c;他的 配置是针对所有元素的。而且 这个 TabBar 下面的 滑块在移动的时…

JDK8升级到JDK17 sun.font.FontDesignMetrics类无效替代方案

问题&#xff1a; 项目从jdk1.8切成jdk17后 FontMetrics fontMetrics FontDesignMetrics.getMetrics(font); 报错&#xff1a; cannot access class sun.font.FontDesignMetrics (in module java.desktop) because module java.desktop does not export sun.font 搜索资料&am…

Spring boot 2.0 升级到 3.3.1 的相关问题 (二)

文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 &#xff08;二&#xff09;自定义错误处理页面的问题问题描述问题解决 spring.factories 废弃的问题问题描述问题解决 Spring boot 2.0 升级到 3.3.1 的相关问题 &#xff08;二&#xff09; 自定义错误处理页面的问题 问…

4.定时器

原理 时钟源&#xff1a;定时器是内部时钟源&#xff08;晶振&#xff09;&#xff0c;计数器是外部计时长度&#xff1a;对应TH TL计数器初值寄存器(高八位,低八位)对应的中断触发函数 中断源中断处理函数Timer0Timer0_Routine(void) interrupt 1Timer1Timer1_Routine(void) …

爬虫学习 | 01 Web Scraper的使用

目录 背景介绍&#xff1a; 第一部分&#xff1a;Web Scraper简介 1.什么是Web Scraper&#xff1a; Web Scraper&#x1f6d2; 主要用途&#xff1a; 2.为什么选择Web Scraper&#xff1a; 第二部分&#xff1a;安装Web Scraper ​​​​​1.打开google浏览器&#xf…

C语言走马灯文字

目录 开头程序程序的流程图程序的效果结尾 开头 大家好&#xff0c;我叫这是我58。你们听说过走马灯吗&#xff1f;如果没听说过&#xff0c;那也没关系&#xff0c;因为走马灯其实是一种里面的图案会移动的灯笼&#xff0c;而且因为走马灯里面的图案的移动方式有两种&#xf…

【QT学习十五】 QT基本绘图

目录 1. Qt绘图基础 1.1 什么是Qt绘图 1.2 基本绘图类与函数 2. 简单图形绘制 2.1 画线、矩形和椭圆 2.2 绘制文本和图像 3. 高级绘图技巧 3.1 使用QPainterPath绘制复杂图形 3.2 渐变填充与图案填充 4. 绘图性能优化 4.1 双缓冲技术 4.2 使用QPixmap和QImage提高性…

object-C 解答算法:合并两个有序数组(leetCode-88)

合并两个有序数组(leetCode-88) 题目如下图:(也可以到leetCode上看完整题目,题号88) 首先搞懂,什么叫“非递减顺序” 非递减顺序,是指一个序列中的元素从前往后&#xff08;或从左到右&#xff09;保持不减少或相等。 这意味着序列中的元素可以保持相同的值&#xff0c;但不会…

实战:SpringBoot扩展功能ExitCodeGenerator生成的退出代码

1. 简介 ExitCodeGenerator是 Spring Boot 框架中的一个接口&#xff0c;它允许应用程序退出时生成自定义的退出代码。你可以根据不同的退出码&#xff0c;执行相应的动作&#xff0c;如&#xff1a;资源清理&#xff0c;日志记录等。 我们可以通过实现ExitCodeGenerator接口…

全网最适合入门的面向对象编程教程:17 类和对象的Python实现-鸭子类型与“file-like object“

全网最适合入门的面向对象编程教程&#xff1a;17 类和对象的 Python 实现-鸭子类型与“file-like object“ 摘要&#xff1a; 本文主要介绍了 Python 中创建自定义类时鸭子类型的基本定义、特点和应用场景&#xff0c;同时列举了**“file-like object“** 的例子对鸭子类型进…

axios以post方式提交表单形式数据

某些后端框架请求接口必须走form表单提交的那种形式&#xff0c;但前端很少有<form action"接口地址" method"post"></form>这种写法去提交表单数据&#xff0c;所以前端需要用axios模拟一个表单提交接口。 Content-Type 代表发送端&#xff0…

单链表的介绍和实现

前言 Hello,小伙伴们&#xff0c;你们的作者君又回来了&#xff0c;今天我将带领大家继续学习另一种线性表&#xff1a;单链表&#xff0c; 准备好的小伙伴三连打卡上车&#xff0c;你们的支持就是我更新的动力&#xff0c;一定不要吝啬手中的三连哟&#xff0c;万分感谢&…

ElementUI el-select 组件动态设置disabled后,高度变更的问题解决办法

问题描述 Vue2 项目在使用 el-select 组件时&#xff0c;动态将disabled变更为了 true&#xff0c;元素的高度发生了变化。 问题原因 通过浏览器开发人员工具面板&#xff0c;发现&#xff0c;组件内的 input 元素被动态设置了height的样式&#xff1a; 在项目中检查后并…