You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 19:54:06