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.mzph.cn/news/134610.shtml

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

相关文章

Hello Vue!

目录 前言 hello vue 为什么要new Vue(),而不能直接调用Vue()? Vue构造函数中的形参options template配置项 $mount()方法 前言 从此篇博客开始&#xff0c;将开启vue的学习&#xff0c;查缺补漏。 只要学计算机语言&#xff0c;那么hello xxx那一定是入门第一行代码了…

【深度学习】pytorch——Autograd

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 深度学习专栏链接&#xff1a; http://t.csdnimg.cn/dscW7 pytorch——Autograd Autograd简介requires_grad计算图没有梯度追踪的张量ensor.data 、tensor.detach()非叶子节点的梯度计算图特点总结 利用Autograd实…

vmware虚拟机设置静态ip之后无法联网

今天在vmware虚拟机设置静态ip&#xff0c;设置静态ip之后无法联网&#xff08;ping&#xff09;&#xff0c;并且SecureCRT无法连接上虚拟机。 网卡参数配置没有问题&#xff0c;可是却发联网&#xff0c;ping网站也不通 显示未知的名称和服务&#xff0c;开始以为网管和DNS是…

注册虾皮买家号需要哪些资料?

注册虾皮买家号其实是很简单的&#xff0c;使用相应国家的手机号及对应的环境就可以注册了的&#xff0c;如果想要账号更方便使用&#xff0c;也可以绑定邮箱进行认证。 而如果想要使用shopee买家通系统进行自动化的注册&#xff0c;那么对于资料就有一定的要求了。 1、手机号…

【算法 | 模拟No.3】leetcode 38. 外观数列

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【Leetcode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

微服务-grpc

微服务 一、微服务&#xff08;microservices&#xff09; 近几年,微服这个词闯入了我们的视线范围。在百度与谷歌中随便搜一搜也有几千万条的结果。那么&#xff0c;什么是微服务 呢&#xff1f;微服务的概念是怎么产生的呢&#xff1f; 我们就来了解一下Go语言与微服务的千丝…

RDS for Mysql 到云数据库GaussDB

前言 该实验旨在指导用户使用DRS将RDS MySQL上的数据迁移到 GaussDB中。 本实验涉及数据复制服务DRS&#xff08;Data Replication Service&#xff09;、关系型数据库服务RDS&#xff08;Relational Database Service&#xff09;、GaussDB、数据管理服务DAS&#xff08;Data…

从研发域到量产域的自动驾驶工具链探索与实践

导读 本文整理自 2023 年 9 月 5 日百度云智大会 - 智能汽车分论坛&#xff0c;百度智能云自动驾驶云研发高级经理徐鹏的主题演讲《从研发域到量产域的自动驾驶工具链探索与实践》。 全文中部段落附有演讲中 2 个产品演示视频的完整版&#xff0c;精彩不容错过。 (视频观看&…

Redis7--基础篇2(Redis的十大数据类型及常用命令)

1. Redis的十大数据类型及常用命令 Redis是key-value键值对类型的数据库&#xff0c;我们所说的数据类型指的是value的数据类型&#xff0c;key的数据类型都是字符串。 1.1 字符串&#xff08;String&#xff09; string是redis最基本的类型&#xff0c;一个key对应一个val…

船舶数据采集与数据模块解决方案

标准化信息处理单元原理样机初步方案&#xff1a; 1&#xff09;系统组成 标准化信息处理单元原理样机包含硬件部分和软件部分。 硬件部分包括集成电路板、电源模块、主控模块、采集模块、信息处理模块、通讯模块、I/O模块等。 软件部分包括协议统一标准化模块、设备互联互…

Scala爬虫如何实时采集天气数据?

这是一个基本的Scala爬虫程序&#xff0c;使用了Scala的http library来发送HTTP请求和获取网页内容。在爬取天气预报信息时&#xff0c;我们首先需要创建一个代理对象proxy&#xff0c;并将其用于发送HTTP请求。然后&#xff0c;我们使用http库的GET方法获取网页内容&#xff0…

【高分快刊】Elsevier旗下,中科院2区SCI,2个月19天录用!

计算机类 • 高分快刊解读 今天小编带来Elsevier旗下计算机领域好刊的解读&#xff0c;如有相关领域作者有意向投稿&#xff0c;可作为重点关注&#xff01;后文有真实发表案例&#xff0c;供您投稿参考~ 01 期刊简介 ☑️出版社&#xff1a;Elsevier ☑️影响因子&#xf…

能源监测管理系统有哪些作用与效果?

随着全球能源的不断增加&#xff0c;能源的有限性与环境问题日益严重&#xff0c;用能管理企业需要一种高效的方法来管理能源与利用能源&#xff0c;因此能源监测管理系统成为了一种不可或缺的工具。 能源监测管理系统的重要性 1、实现节能减排的目标 通过系统&#xff0c;可…

电动汽车充放电V2G模型

威♥关注“电击小子程高兴的MATLAB小屋”获取更多资料 1主要内容 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消纳供给商场基础负荷剩余的光伏电量&#xf…

一例恶搞的样本的分析

概述 这个病毒会将自身伪装成水印标签系统&#xff0c;通过感染桌面和U盘中的后缀名为.doc、.xls、.jpg、.rar的文件来传播。会监听本地的40118端口&#xff0c;预留一个简单的后门&#xff0c;利用这个后门可远程执行锁屏、关机、加密文件、开启文件共享等操作。 样本的基本…

【Azure 架构师学习笔记】-Azure Storage Account(5)- Data Lake layers

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;4&#xff09;- ADF 读取Queue Storage 前言 不管在云还是非云环境中&#xff0c; 存储是IT 系统的其中一个核心组件。在…

Educational Codeforces Round 157 (A--D)视频详解

Educational Codeforces Round 157 &#xff08;A--D&#xff09;视频详解 视频链接A题代码B题代码C题代码D题代码 视频链接 Educational Codeforces Round 157 &#xff08;A–D&#xff09;视频详解 A题代码 #include<bits/stdc.h> #define endl \n #define deb(x)…

React 其他常用Hooks

1. useImperativeHandle 在react中父组件可以通过forwardRef将ref转发到子组件&#xff1b;子组件拿到父组件创建的ref&#xff0c;绑定到自己的某个元素&#xff1b; forwardRef的做法本身没有什么问题&#xff0c;但是我们是将子组件的DOM直接暴露给了父组件&#xff0c;某下…

shopee、亚马逊卖家如何安全给自己店铺测评?稳定测评环境是关键

大家都知道通过测评可以提升产品的转化率&#xff0c;提升产品的销量&#xff0c;那么做跨境平台的卖家如何安全的给自己店铺测评呢&#xff1f; 无论是亚马逊、拼多多Temu、shopee、Lazada、wish、速卖通、敦煌网、Wayfair、雅虎、eBay、Newegg、乐天、美客多、阿里国际、沃尔…

【数据结构】树与二叉树(五):二叉树的顺序存储(初始化,插入结点,获取父节点、左右子节点等)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1&#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个&#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2&#xff1a;高度为k的二叉…