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,直接完成反序列化最终结果如下:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DuiLib中常用各种RGB颜色对照表

【常识】常用RGB颜色对照表] 颜色样式***RGB*数值颜色代码颜色样式***RGB*数值颜色代码黑色0,0,0#000000白色255,255,255#FFFFFF象牙黑88,87,86#666666天蓝灰202,235,216#F0FFFF冷灰128,138,135#808A87灰色192,192,192#CCCCCC暖灰128,118,105#808069象牙灰251,255,242#FAFFF0石…

Vue 入门案例剖析

vscode 启用open with live server功能&#xff0c;配置谷歌浏览器chrome_小头猿的博客-CSDN博客 之所以使用vue就是想让其帮我们构建页面&#xff0c;构建出来了页面但是摆在那个位置呢&#xff1f;所以得准备好一个容器&#xff0c;最起码得有东西去承接这个界面。 控制台这…

红海云签约和兆服饰,科技引领服饰行业人力资源数字化转型

和兆服饰从事多品牌多品类经营管理&#xff0c;旗下拥有POLOSPORT、POLOKIDS、CARTELO等国际品牌。作为一个主打POLO文化的服饰品牌&#xff0c;诞生于美国的POLOSPORT拥有现代感的产品设计、系列化的产品搭配、全方位的服务&#xff0c;是最具美国马球精神的休闲时尚服饰品牌之…

暖通空调系统使用Modbus转Profinet网关应用配置案例

PLC通过兴达易控Modbus转Profinet网关&#xff08;XD-MDPN100)控制暖通空调的温度、湿度。作为控PLC可以通过Modbus传输到Profinet网关&#xff0c;与空调系统的压缩机进行通信&#xff0c;从而准确控制单元的加热、加湿、冷却和减湿。PLC可以实时监控和调整空调系统的运行状态…

给VSCode插上一双AI的翅膀

#AI编程助手哪家好&#xff1f;DevChat“真”好用# 文章目录 前言一、安装DevChat1.1、访问地址1.2、注册1.3、在VSCode里安装DevChat插件1.3.1、未安装状态1.3.2、已安装状态 二、设置Access Key2.1. 点击左下角管理&#xff08;“齿轮”图标&#xff09;—命令面板&#xff…

mac 卸载第三方输入法

输入法设置里的移除&#xff0c;并不是真的卸载&#xff0c;点击还是能添加回来 在活动监视器里强制退出此输入法在访达界面使用快捷键 ShiftcommandG在弹出的对话框内输入以下路径&#xff08;/资源库/Input Methods&#xff09;&#xff0c;再点击下面的前往找到你要卸载的输…

【深度神经网络(DNN)】实现车牌识别

文章目录 前言一、数据集介绍二、步骤1.导包2.参数配置3.数据处理4.模型定义5.模型训练6.模型预测 总结 前言 课内实践作业 车牌识别 一、数据集介绍 1.车牌识别数据集&#xff1a;VehicleLicense车牌识别数据集包含16151张单字符数据&#xff0c;所有的单字符均为严格切割且…

【网络协议】聊聊HTTPDNS如何工作的

传统 DNS 存在哪些问题&#xff1f; 域名缓存问题 我们知道CND会进行域名解析&#xff0c;但是由于本地会进行缓存对应的域名-ip地址&#xff0c;所以可能出现过期数据的情况。 域名转发问题 出口 NAT 问题 域名更新问题 解析延迟问题 因为在解析DNS的时候&#xff0c;需要进行…

MySQL:锁机制

目录 概述三种层级的锁锁相关的 SQLMyISAM引擎下的锁InnoDB引擎下的锁InnoDB下的表锁和行锁InnoDB下的共享锁和排他锁InnoDB下的意向锁InnoDB下的记录锁&#xff0c;间隙锁&#xff0c;临键锁记录锁&#xff08;Record Locks&#xff09;间隙锁&#xff08;Gap Locks&#xff0…

IDEA Plugin插件开发相关踩坑

1 前言 最近在研究IDEA插件开发&#xff0c;踩了不少坑&#xff0c;特意在这里记录一下…… 2 Java相关类找不到 照着网上一些资料&#xff0c;想要实现代码审计自动提示功能&#xff0c;需要继承AbstractBaseJavaLocalInspectionTool 结果import一片爆红&#xff0c;找不到相…

从F5 BIG-IP RCE漏洞(CVE-2023-46747)来看请求走私的利用价值

0x01 前言 F5 BIG-IP广域流量管理器是一种网络流量管理设备&#xff0c;用于提升链路性能与可用性。F5在金融行业具有特别广泛的使用量&#xff0c;做过各大银行攻防演练的小伙伴对这个系统应该不会陌生。 最近爆出的CVE-2023-46747漏洞能达到远程RCE的效果&#xff0c;属于严重…

论文阅读——InternImage(cvpr2023)

arxiv&#xff1a;https://arxiv.org/abs/2211.05778 github&#xff1a;https://github.com/OpenGVLab/InternImage 一、介绍 大部分大模型都是基于transformer的&#xff0c;本文是一个基于CNN的视觉基础模型。使用可变性卷积deformable convolution作为核心操作&…

Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器(一)

下一篇&#xff1a;Python tkinter实现复刻Windows记事本UI和菜单的文本编辑器&#xff08;二&#xff09;-CSDN博客 介绍&#xff1a; Windows操作系统中自带了一款记事本应用程序&#xff0c;通常用于记录文字信息&#xff0c;具有简单文本编辑功能。Windows的记事本可以新…

Go和JavaScript结合使用:抓取网页中的图像链接

前言 在当今数字化时代&#xff0c;数据是金钱的源泉&#xff0c;对于许多项目和应用程序来说&#xff0c;获取并利用互联网上的数据是至关重要的。其中之一的需求场景是从网页中抓取图片链接&#xff0c;这在各种项目中都有广泛应用&#xff0c;特别是在动漫类图片收集项目中…

漏刻有时百度地图API实战开发(6)多个标注覆盖层级导致不能响应点击的问题

漏刻有时百度地图API实战开发(1)华为手机无法使用addEventListener click 的兼容解决方案漏刻有时百度地图API实战开发(2)文本标签显示和隐藏的切换开关漏刻有时百度地图API实战开发(3)自动获取地图多边形中心点坐标漏刻有时百度地图API实战开发(4)显示指定区域在移动端异常的解…

【MATLAB源码-第70期】基于matlab的萤火虫算法(FA)的栅格路径规划,输出最短路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 萤火虫算法&#xff08;Firefly Algorithm&#xff0c;FA&#xff09;是由剑桥大学的Xin-She Yang在2008年提出的一种元启发式优化算法。该算法的灵感来源于萤火虫闪烁的行为特征&#xff0c;主要用于解决连续的优化问题。萤…

在 Gorm 中学习分页和排序

一个全面的指南&#xff0c;教您在 GORM 中实现分页和排序&#xff0c;以实现高效的数据检索和展示 高效的数据检索和展示是应用程序开发的关键方面。GORM&#xff0c;强大的 Go 对象关系映射库&#xff0c;为开发人员提供了强大的工具来实现这一目标。在本指南中&#xff0c;…

去中心化数据云项目Oort主网即将上线

备受期待的去中心化数据云项目Oort&#xff0c;今日已通过官方X账号官宣&#xff0c;将于纽约时间11月27日正式上线主网Olympus Protocol。届时&#xff0c;用户也能够通过Oort的Ale Wallet钱包和开发者API使用主网&#xff0c;并可通过OORT浏览器查询交易和合约&#xff0c;开…

代码随想录 Day41 动态规划09 LeetCode T121 买卖股票的最佳时机 T122 买卖股票的最佳时机II

前言 这两题看起来是不是有点眼熟,其实我们在贪心章节就已经写过了这两道题,当时我们用的是将利润分解,使得我们始终得到的是最大利润 假如第 0 天买入&#xff0c;第 3 天卖出&#xff0c;那么利润为&#xff1a;prices[3] - prices[0]。 相当于(prices[3] - prices[2]) (pri…

小程序 打开方式 页面效果 表单页面 点击跳到详情页 图标 获取后台数据 进行页面渲染

请求地址&#xff1a;geecg-uniapp 同源策略 数据请求 获取后台数据 ui库安装 冲突解决&#xff08;3&#xff09;-CSDN博客 一.uniapp转小程序 (1) 运行微信开发工具 &#xff08;2&#xff09; 配置id 然后运行 打开小程序 路径 E:\通\uniapp-jeecg\unpackage\dist\d…