C#如何反序列化带不同Row标签的同结构XML项到实体列表
C# 动态名称XML节点反序列化解决方案
问题原因
现有实体类结构不匹配XML层级,且Zones节点下的Row带数字后缀属于动态元素名,无法通过固定XmlElement标记直接映射为数组。同时反序列化代码存在强制类型转换错误。
调整步骤
1. 修改实体类定义
using System.Collections.Generic; using System.Xml; using System.Xml.Serialization; namespace MyApp.Models { [XmlRoot(ElementName = "Settings")] public class XML_Settings { [XmlElement(ElementName = "FileName")] public string FileName { get; set; } [XmlElement(ElementName = "Zones")] public Zones Zones { get; set; } [XmlElement(ElementName = "Network_IP")] public string NetworkIP { get; set; } [XmlElement(ElementName = "Ethernet_Enable")] public bool EthernetEnable { get; set; } [XmlElement(ElementName = "Language")] public int Language { get; set; } } public class Zones { // 捕获Zones下所有名称不固定的RowX节点 [XmlAnyElement] public List<XmlElement> RowNodes { get; set; } // 自动转换为可用的强类型Zones_Points列表,直接调用即可 [XmlIgnore] public List<Zones_Points> ZonesPointsList { get { var list = new List<Zones_Points>(); if (RowNodes == null) return list; foreach (var node in RowNodes) { var point = new Zones_Points(); point.Address = int.Parse(node["Address"]?.InnerText ?? "0"); point.PointZone = int.Parse(node["Zone"]?.InnerText ?? "0"); point.Installed = bool.Parse(node["Installed"]?.InnerText ?? "false"); list.Add(point); } return list; } } } public class Zones_Points { public int Address { get; set; } public int PointZone { get; set; } public bool Installed { get; set; } } }
2. 修正反序列化代码
Models.XML_Settings input = null; using StreamReader stream_xml = new StreamReader(xmlfile_path, CodePagesEncodingProvider.Instance.GetEncoding(1253)); XmlSerializer serializer = new XmlSerializer(typeof(Models.XML_Settings)); try { input = (Models.XML_Settings)serializer.Deserialize(stream_xml); // 直接通过 input.Zones.ZonesPointsList 获取所有Row对应的实体集合 } catch (Exception exception) { MessageBox.Show(exception.Message); }
原理说明
[XmlAnyElement]标记会将对应节点下所有未提前声明元素名的XML节点全部捕获,存入指定的XmlElement集合,完美适配动态后缀的RowX节点- 新增的
ZonesPointsList属性自动将原始XML节点转换为可直接使用的强类型对象集合,无需额外手动处理
内容的提问来源于stack exchange,提问作者GSmyrlis
相关产品推荐
相关产品推荐

