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

news2024/11/16 12:34:42

虽然现在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.coloradmin.cn/o/1181340.html

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

相关文章

【接口测试】最全Jmeter跨线程调用变量+签名接口测试实战(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 跨线程调用变量 …

Android Studio(项目收获)

取消按钮默认背景色 像按钮默认背景色为深蓝色&#xff0c;即使使用了background属性指定颜色也不能生效。 参考如下的解决方法&#xff1a; 修改/res/values/themes.xml中的指定内容如下&#xff1a; <style name"Theme.TianziBarbecue" parent"Theme.Mater…

4-Tomcat服务器及标准Web项目结构

4-Tomcat服务器及标准Web项目结构 文章目录 4-Tomcat服务器及标准Web项目结构Web服务器组成Web项目的标准结构根目录下可以放置的文件及文件夹WEB标准结构Web的url组成部分和项目中资源的对应关系 Tomcat服务器部署Tomcat部署Web项目的三种方式IDEA部署项目APP到Tomcat的方式概…

响应式编程-基本介绍

响应式编程-基本介绍 什么是响应式编程 响应式宣言&#xff08;The Reactive Manifesto&#xff09; 对响应式系统进行了定义&#xff1a;响应式系统是具备以下特质即时响应性&#xff08;Responsive&#xff09;、回弹性&#xff08;Resilient&#xff09;、弹性&#xff08…

Freeswitch API调用方式

1.API调用方式 可以复制下面内容成.bat文件直接在windows下运行&#xff0c;修改成对应的ip加端口。 echo off SETLOCAL :_starting cls set inputecho echo 1 add agent 21009 11 uuid_check 21009 21 list users 31 check modules …

JAVA中类和对象的认识

1、面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program&#xff0c;简称OOP)&#xff0c;在面向对象的世界里&#xff0c;一切皆为对象。面 向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。用面向对象的…

LabVIEW示波器连续触发编程

LabVIEW示波器连续触发编程 niScopeEX Fetch Forever范例利用了如何设置硬件和驱动的优点来进行连续采集。 当NI-SCOPE设备被设置为采集预触发扫描&#xff0c;设备上的板载内存被用作一个环形缓冲。这样&#xff0c;无论触发何时到来&#xff0c;设备都可以追踪和检索所有要求…

Ubuntu开机无法进入系统,文件根系统目录空间不足导致?

前言&#xff1a; 自己电脑上装的是Win11和Ubuntu20双系统&#xff0c;平时就是切换着用。 偶然有次&#xff0c;Ubuntu提示文件根系统目录空间不足&#xff0c;自己没在意。 结果下次开机进入Ubuntu时候&#xff0c;芭比Q了。。进不了系统 这样的事情发生很多次了&#xff0c;…

密度聚类与层次聚类

大家好&#xff0c;我是带我去滑雪&#xff01; 密度聚类&#xff08;Density-based Clustering&#xff09;和层次聚类&#xff08;Hierarchical Clustering&#xff09;是两种不同的聚类方法&#xff0c;用于将数据集中的数据点分组成簇。 目录 一、密度聚类 &#xff08;…

高频时序数据仓库-在线课堂二

详细了解天软高频时序数据仓库的构架及性能后&#xff0c;本周天软在线课堂将带来高频时序数据仓库的应用展示。扫描图片二维码可报名参会。

MATLAB|热力日历图

目录 日历图介绍&#xff1a; 热力日历图的特点&#xff1a; 应用场景&#xff1a; 绘图工具箱 属性 (Properties) 构造函数 (Constructor) 公共方法 (Methods) 私有方法 (Private Methods) 使用方法 日历图介绍&#xff1a; 热力日历图是一种数据可视化形式&#xf…

Pioneer电源维修PM36218B-10P-1-8PH-J

开关电源出现不启振的时候&#xff0c;我们通常需要查看开关频率是否正确、保护电路是否断路、电压反馈电路、电流反馈电路又没问题&#xff0c;开关管是否击穿等。 pioneer电源维修时&#xff0c;PWM模块为UC3843&#xff0c;检测未发现其他异常&#xff0c;在R(220K)上并接一…

美妆行业如何通过自媒体提升品牌曝光

自媒体的出现使美妆行业的推广方式产生了变化&#xff0c;自媒体平台的用户年轻化、用户基数大、消费力较强&#xff0c;能够接受新鲜事物&#xff0c;为美妆品牌带来广阔的市场和消费人群。 因此自媒体平台的内容运营十分重要&#xff0c;今天媒介盒子就来和大家聊聊&#xf…

VBA技术资料MF80:选择文件及文件夹

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

ARPG----C++学习记录03 Section7位置,偏移,函数

Pawn 新建一个Pawn的c类Bird&#xff0c;并且新建一个蓝图 添加一个Capsule&#xff08;胶囊&#xff09; 不知道要加啥头文件&#xff0c;去网站找https://docs.unrealengine.com/5.3/en-US/API/Runtime/Engine/Components/UCapsuleComponent/SetCapsuleSize/ 包含文件名字的头…

【vue3/高德地图】实现地图打点/自定义点位图标/地理围栏实现

<template><div class"app-container"><div id"container"></div></div> </template><script setup> import AMapLoader from amap/amap-jsapi-loader; /*在Vue3中使用时,需要引入Vue3中的shallowRef方法(使用s…

Microsoft Edge浏览器不兼容解决办法

找到 Edge 的安装位置&#xff0c;一般在 C:\Program Files (x86)Microsoft Edge\Application\ 这个目录&#xff0c;把 edge.exe 或msedge.exe 修改为 chrome.exe 再重启电脑。

DocTemplateTool - 可根据模板生成word或pdf文件的工具

你是否经常遇到这样的场景&#xff1a;产品运营有着大量的报告需求&#xff0c;或者给客户领导展现每周的运营报告&#xff1f;这些文档类的任务可以交给运营同事&#xff0c;他们负责文档排版和样式&#xff0c;你作为开发人员你只需要提供数据源&#xff0c;和一个映射表&…

C++ -std 编译标准

概述 任何一门编程语言都有相关的组织和团体在不停的维护和更新。原因很简单&#xff0c;时代在发展&#xff0c;编程语言如果停滞不前&#xff0c;最终就会被淘汰。 以 C 语言为例&#xff0c;发展至今该编程语言已经迭代了诸多个版本&#xff0c;例如 C89 &#xff08;偶尔…

十大字体设计网站年终盘点:顶级设计师独家推荐

即时设计 首款国产的专业 UI 设计工具即时设计&#xff0c;官方字体库内置几十种字体任你选择&#xff0c;例如阿里巴巴惠普体、思源宋体、思源黑体、优设标题黑等&#xff0c;一键点击使用无需下载安装。还能够根据设计内容进行字体粗细调节&#xff0c;从纤细到特粗&#xf…