C#解析XML并反序列化为Model的方法

虽然现在json大行其道,但是xml格式依旧占据着广阔的编程世界,不管光伏锂电激光卫星汽车等等工业领域,基本上都是以xml为主,广大的.NET开发人员有很多被xml折磨的都要转java了,这篇小作文就来玩一种迅速完成xml到model的过程,让老板交代的任务能在5分钟解决,真正实现上班5分钟,摸鱼7小时。

本次要解析的XML格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<GCS Version="0x100"><ProjectInfo CfgUUID="5f2acfd0-aa91-49bb-a6d3-8f994810ffd5" ReduFlag="YES" UcpProtocol="1"ControllerType="33280" ProjectName="5201rddcwx" IPADDRA="172.20.1.2" IPADDRB="172.21.1.2" /><MemInfo><Area Size="131072" Index="0" Name="A" /><Area Size="131072" Index="1" Name="B" /></MemInfo><TagList><Tag Index="0" Name="MODULE1_TCPCmd0_VAR_OUT" Desc="" BitOffset="0" Offset="0"DataType="MODBUS_DT0" InitValue="OFF" AccessRight="ReadWrite" /><Tag Index="0" Name="MODULE1_TCPCmd1_VAR" Desc="" BitOffset="0" Offset="80"DataType="MODBUS_DT4" InitValue="OFF" AccessRight="ReadWrite" /></TagList><TagListSafety><Tag Index="0" Name="MODULE1_TCPCmd0_VAR_OUT" Desc="" UCPINDEX="2" BitOffset="0" Offset="0"DataType="INT" InitValue="OFF" AccessRight="ReadWrite" /><Tag Index="0" Name="MODULE1_TCPCmd1_VAR" Desc="" UCPINDEX="2" BitOffset="0" Offset="80"DataType="DWORD" InitValue="OFF" AccessRight="ReadWrite" /></TagListSafety><DataTypeList><Struct Size="4" Name="COM5002TCP_D" Desc=""><Element Name="DEVCFGSTATE" Desc="描述描述" BitOffset="1" Offset="0" DataType="BOOL" /><Element Name="DEVTYPESTATE" Desc="描述描述" BitOffset="2" Offset="0"DataType="BOOL" /><Element Name="COMMSTATE" Desc="描述描述" BitOffset="3" Offset="0" DataType="BOOL" /></Struct><Struct Size="40" Name="COM5002TCP_IN" Desc=""><Element Name="DEVCFGSTATE" Desc="描述描述" BitOffset="7"Offset="0" DataType="BOOL" /></Struct><Struct Size="128" Name="GCU5201_D" Desc=""><Element Name="KeyMode" Desc="描述描述" BitOffset="0" Offset="78" DataType="BYTE" /><Element Name="TIME" Desc="描述描述" BitOffset="0" Offset="0" DataType="TIME_FMT"><Element Name="TIME.YEAR" Desc="描述描述" BitOffset="0" Offset="0" DataType="BYTE" /><Element Name="TIME.MONTH" Desc="描述描述" BitOffset="0" Offset="1" DataType="BYTE" /></Element><Element Name="TimeServerDiag" Desc="描述描述" BitOffset="0" Offset="16"DataType="BYTE" /></Struct><Struct Size="24" Name="MODBUS_DT0" Desc=""><Element Name="VAR0" Desc="" BitOffset="0" Offset="12" DataType="INT" /><Element Name="VAR1" Desc="" BitOffset="0" Offset="14" DataType="INT" /><Element Name="VAR2" Desc="" BitOffset="0" Offset="16" DataType="INT" /><Element Name="VAR3" Desc="" BitOffset="0" Offset="18" DataType="INT" /><Element Name="VAR4" Desc="" BitOffset="0" Offset="20" DataType="INT" /></Struct><Struct Size="12" Name="MODBUS_DT2" Desc=""><Element Name="CommState" Desc="描述描述" BitOffset="4" Offset="0" DataType="BOOL" /></Struct><Struct Size="208" Name="MODBUS_DT4" Desc=""><Element Name="VAR0" Desc="" BitOffset="0" Offset="8" DataType="INT" /></Struct><Struct Size="4" Name="POINTER" Desc="" /><Struct Size="8" Name="TIME_FMT" Desc="STR_GC_CI_DATATYPE_TIME_FMT_DESC"><Element Name="YEAR" Desc="骞" BitOffset="0" Offset="0" DataType="BYTE" /></Struct><Struct Size="64" Name="_SEND_CMD" Desc=""><Element Name="pIN" Desc="STR_SC_AUX_SEND_CMD_INPUT_pIN" BitOffset="0" Offset="0"DataType="DWORD" /></Struct><Array Size="256" Name="GCU5201_D[2]" ElementDataType="GCU5201_D" ElementNum="2" /></DataTypeList>
</GCS>

可以看到本次的xml都是XmlAttribute,此处可以借助 System.Xml这个类进行操作,先新建所有类:
 

 [XmlRoot("GCS")]public class SuperConGCSInfo{[XmlElement("ProjectInfo")]public ProjectInfo ProInfo { get; set; }[XmlArray("MemInfo")][XmlArrayItem("Area")]public MemInfo[] MemInfos { get; set; }[XmlArray("TagList")][XmlArrayItem("Tag")]public Tags[] TagList { get; set; }[XmlArray("TagListSafety")][XmlArrayItem("Tag")]public Tags[] TagListSafety { get; set; }[XmlElement("DataTypeList")]public DataTypeList DataTypeList { get; set; }}public class DataTypeList{[XmlElement("Struct")]public Struct[] Struct { get; set; }[XmlElement("Array")]public Arrays[] Arrays { get; set; }}public class Arrays{[XmlAttribute("Size")]public string Size { get; set; }[XmlAttribute("Name")]public string Name { get; set; }[XmlAttribute("ElementDataType")]public string ElementDataType { get; set; }[XmlAttribute("ElementNum")]public string ElementNum { get; set; }}public class ProjectInfo{[XmlAttribute("CfgUUID")]public string CfgUUID { get; set; }[XmlAttribute("ReduFlag")]public string ReduFlag { get; set; }[XmlAttribute("UcpProtocol")]public string UcpProtocol { get; set; }[XmlAttribute("ControllerType")]public string ControllerType { get; set; }[XmlAttribute("ProjectName")]public string ProjectName { get; set; }[XmlAttribute("IPADDRA")]public string IPADDRA { get; set; }[XmlAttribute("IPADDRB")]public string IPADDRB { get; set; }}public class MemInfo{[XmlAttribute("Size")]public string Size { get; set; }[XmlAttribute("Index")]public string Index { get; set; }[XmlAttribute("Name")]public string Name { get; set; }}public class Tags{[XmlAttribute("Index")]public string Index { get; set; }[XmlAttribute("Name")]public string Name { get; set; }[XmlAttribute("Desc")]public string Desc { get; set; }[XmlAttribute("BitOffset")]public string BitOffset { get; set; }[XmlAttribute("Offset")]public string Offset { get; set; }[XmlAttribute("DataType")]public string DataType { get; set; }[XmlAttribute("InitValue")]public string InitValue { get; set; }[XmlAttribute("AccessRight")]public string AccessRight { get; set; }}public class Struct{[XmlAttribute("Size")]public string Size { get; set; }[XmlAttribute("Name")]public string Name { get; set; }[XmlElement("Element")]public Element[] Elements { get; set; }}public class Element{[XmlAttribute("Name")]public string Name { get; set; }[XmlAttribute("Desc")]public string Desc { get; set; }[XmlAttribute("BitOffset")]public string BitOffset { get; set; }[XmlAttribute("Offset")]public string Offset { get; set; }[XmlAttribute("DataType")]public string DataType { get; set; }[XmlElement("Element")]public Element[] Elements { get; set; }}

说明一下这里面的一些特性。

根节点(XmlRoot):

        首先类中包含根节点(XmlRoot)GCS,跟节点是xml中最外层的包裹元素,C#中使用XmlRoot特性声明;


元素节点(XmlElement)

        xml中任何一个节点,不知道怎么生命,其实都可以使用XmlElement,它是万能的。比如我们上面xml看到的ProjectInfo、DataTypeList等等包裹的节点都是;

数组(XmlArray):

        数组节点一般情况下都是和XmlArrayItem搭配使用,比如MemInfo是数组,那XmlArrayItem就是Area,TagList对应的是Tag,TagListSafety对应也是Tag,这样一声明就非常清晰。c#中数组使用XmlArray、子类使用XmlArrayItem声明。

        以上xml我们需要注意的是DataTypeList这个节点,DataTypeList可以使用XmlArray进行声明,但是如果一旦这样声明,就会导致Array读取失败,所以我这边单独又新建一个类DataTypeList,DataTypeList类里面又分别使用XmlElement声明一个Struct和Array,这样下去,就能正常读取了。

        其实System.Xml里面有非常多的特性,比如枚举(XmlEnum),忽略(XmlIgnore)、包含(XmlInclude),纯文本(XmlText)、抽象类型(XmlType)等等,但是基本上不在特殊场合基本上用不到,其余的可以自行新建xml试试。

新建读取xml方法:

 public T DeserializeFromXml<T>(string filePath){try{using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8)){XmlSerializer xs = new XmlSerializer(typeof(T));T ret = (T)xs.Deserialize(reader);return ret;}}catch{return default(T);}}

使用文件上传方式读取xml:
 

 var dialog = new OpenFileDialog{DefaultExt = "*.xml",AddExtension = true,Filter = "Import Files|*.xml",CheckPathExists = true};
if (dialog.ShowDialog() != true || string.IsNullOrEmpty(dialog.FileName) || !File.Exists(dialog.FileName))return;
SuperConGCSInfo beckhoffTagModel = superConVarConver.DeserializeFromXml<SuperConGCSInfo>(dialog.FileName);

以上方法读取xml速度块,能迅速生成一个Model,直接完成反序列化最终结果如下:

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

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

相关文章

rancher或者其他容器平台使用非root用户启动jar

场景&#xff1a; java程序打成镜像&#xff0c;在rancher上运行&#xff0c;默认是root账户&#xff0c;发现hdfs或者hive不允许root账户操作&#xff1b;所以打算用费root账户启动jar&#xff0c;使其具有hive和hdfs的操作权限。 Dockerfile entrypoint.sh 思路就是上面这样…

【Spring】@Component组件

大前提&#xff1a; 添加了相关的约束文件以及注解支持 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:…

LibreOJ - 2874 历史研究 (回滚莫队)

回滚莫队就是在基础莫队的前提下&#xff0c;用更多的增加操作代替了减操作。 分成两种情况 1、一个询问的整个区间都在一个块儿里&#xff1b;这种情况直接暴力求即可&#xff0c;因为在一个块儿里&#xff0c;时间复杂度不会高。 2、一个询问的整个区间不在一个块儿里&#…

有效降低数据库存储成本方案与实践 | 京东云技术团队

背景 随着平台的不断壮大&#xff0c;业务的不断发展&#xff0c;后端系统的数据量、存储所使用的硬件成本也逐年递增。从发展的眼光看&#xff0c;业务与系统要想健康的发展&#xff0c;成本增加的问题必须重视起来。目前业界普遍认同开源节流大方向&#xff0c;很多企业部门…

汽车驾驶智能座舱太阳光模拟器老化试验

一、太阳光模拟器老化试验目的 太阳光模拟器氙光灯老化试验是一种常用的材料老化测试方法&#xff0c;通过模拟自然光照条件下的老化过程&#xff0c;评估材料的耐光性能和耐候性能其主要目的有: 1.评估材料在长时间暴露于自然光照条件下的耐久性能: 2.比较不同材料的耐光性…

vue使用websocket与springboot通信

WebSocket是HTML5下一种新的协议&#xff0c;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的 在很多项目中&#xff0c;都要用到websocket&#xff0c;使得前端页面与后端页进行实时通信&#xff0c;例如&#xff0c;实时查询…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

使用Ruby编写通用爬虫程序

目录 一、引言 二、环境准备 三、爬虫程序设计 1. 抓取网页内容 2. 解析HTML内容 3. 提取特定信息 4. 数据存储 四、优化和扩展 五、结语 一、引言 网络爬虫是一种自动抓取互联网信息的程序。它们按照一定的规则和算法&#xff0c;遍历网页并提取所需的信息。使用Rub…

自动驾驶算法(八):基于概率图算法的路径规划--以PRM为例以及路径规划算法总结

目录 1 概率路线算法简介 2 代码解析 3 路径规划算法总结 1 概率路线算法简介 它属于采样算法里面的一类。主要步骤分为两步&#xff1a; 1.构建概率路线图 (1)随机采样点 (2)将新采样点和距离小于阈值的 采样点连接产生图 2.在图上寻找路径 (1)Dijkstra算法…

大数据中经常使用的指令:

1、Hadoop&#xff1a; 1、关闭Hadoop集群的安全模式&#xff1a; hdfs dfsadmin -safemode leave#查看集群的模式的状态&#xff1a; hdfs dfsadmin -safemode get 2、启动、关闭Hadoop集群&#xff1a; start-all.sh stop-all.sh 3、停止yarn中进程的命令&#xff1a; yar…

游戏中的-雪花算法

1、什么是雪花算法&#xff1f; 雪花算法&#xff08;Snowflake&#xff09;是一种生成唯一ID的算法。在游戏开发过程中会为玩家生成唯一的id&#xff0c;或者玩家获得一件装备&#xff0c;为这件装备生成唯一的Id&#xff0c;将此角色和装备的Id保存于数据库当中。 全局唯一性…

决策式AI与生成式AI

人工智能中深度学习&#xff0c;是一种受人脑的生物神经网络机制启发&#xff0c;并模仿人脑来解释、处理数据的机器学习技术&#xff0c;它能自动对数据进行特征提取、识别、决策和生成。它可以从不同的维度进行划分&#xff0c;如果按模型的特点来划分可分为决策式AI和生成式…

Unity 实现文字过长显示省略号

为了整体效果&#xff0c;当文字过长时&#xff0c;我们就会把超出范围的文字弄成省略号。 要实现文字过长显示省略号&#xff0c;只需要使用TextMeshPro&#xff0c;并设置Overflow属性为Ellipsis即可。 如下图&#xff1a; 记。

fmx windows 下 制作无边框窗口最小化最大化并鼠标可拖移窗口

1,最顶端 放一个rectangle 置顶 ,此区域后面实现鼠标拖动 移动窗口,可在上面放置最大,最小,关闭按钮 2,窗口边框模式 设置 none 3,rectangel mousemove事件 uses Winapi.Windows,Winapi.Messages,FMX.Platform.Winprocedure TfrmMain.Rectangle1MouseMove(Sender: TObje…

【ARM Trace32(劳特巴赫) 使用介绍 2 - Veloce 环境中使用trace32 连接 Cortex-M33】

文章目录 T32MARM 介绍Trace32 .t32 和 .cmm 差异veloce 下启动TRACE321.1.3 TAP 状态机操作命令1.1.3.1 IDCODE&#xff08;Identification Code&#xff09;寄存器 介绍 T32MARM 介绍 T32MARM 是 Lauterbach 的 Trace32 软件包的一部分&#xff0c;专门用于 ARM 基础架构的微…

ElasticSearch 高级查询语法Query DSL实战

ES倒排索引 当数据写入 ES 时&#xff0c;数据将会通过 分词 被切分为不同的 term&#xff0c;ES 将 term 与其对应的文 档列表建立一种映射关系&#xff0c;这种结构就是 倒排索引。如下图所示&#xff1a; 为了进一步提升索引的效率&#xff0c;ES 在 term 的基础上利用 ter…

Redis中的渐进式遍历-Scan命令

之前我们学习过遍历命令keys,而keys *是一次性的把整个redis中所有的key都获取到.在不知道当前redis中有多少key的情况下,这个操作是非常危险的,可能会一下子得到太多的key而阻塞redis服务器.从而使其他redis客户端卡顿. 通过渐进式遍历,就可以做到,既可以获取到所有的key,同时…

linux服务器添置一块新硬盘操作

之前有一台ubuntu服务器&#xff0c;考虑未来存储容量可能不够&#xff0c;添加了一块新的硬盘&#xff0c;这是本次添置硬盘过程。 首次接上硬盘&#xff0c;提示&#xff1a; 没有找到新接入设备&#xff0c;查看接线&#xff0c;主板有个硬盘接线端子坏了&#xff0c;更换一…

【MySQL事务篇】多版本并发控制(MVCC)

多版本并发控制(MVCC) 文章目录 多版本并发控制(MVCC)1. 概述2. 快照读与当前读2.1 快照读2.2 当前读 3. MVCC实现原理之ReadView3.1 ReadView概述3.2 设计思路3.3 ReadView的规则3.4 MVCC整体操作流程 4. 举例说明4.1 READ COMMITTED隔离级别下4.2 REPEATABLE READ隔离级别下 …

C# wpf 实现任意控件(包括窗口)更多拖动功能

系列文章目录 第一章 Grid内控件拖动 第二章 Canvas内控件拖动 第三章 任意控件拖动 第四章 窗口拖动 第五章 附加属性实现任意拖动 第六章 拓展更多拖动功能&#xff08;本章&#xff09; 文章目录 系列文章目录前言一、添加的功能1、任意控件MoveTo2、任意控件DragMove3、边…