使用C# XMLSerializer反序列化带属性的XML数组如何定义模型特性
C# XmlSerializer 反序列化该XML结构的实现方案
核心逻辑
你遇到的问题核心是<details>节点不是纯集合容器,自身携带属性,因此不能直接将其定义为集合类型,必须拆分为独立实体类承接节点属性,再在类内部定义子节点集合。
完整模型类定义
using System.Collections.Generic; using System.Xml.Serialization; // 对应根节点<profile> [XmlRoot("profile")] public class Profile { [XmlElement("details")] public Details Details { get; set; } } // 对应<details>节点,承载节点自身属性+子节点集合 public class Details { [XmlAttribute("environment")] public string Environment { get; set; } [XmlAttribute("severity")] public string Severity { get; set; } // 直接标记子节点名,不会额外生成嵌套的集合根节点 [XmlElement("detail")] public List<Detail> DetailItems { get; set; } } // 对应单个<detail>节点 public class Detail { [XmlAttribute("unit")] public string Unit { get; set; } [XmlAttribute("value")] public int Value { get; set; } // XmlSerializer会自动转换字符串为数值类型 }
反序列化调用示例
// 你的XML字符串 string xmlContent = @"<profile> <details environment=""sd98qlx"" severity=""critical""> <detail unit=""sec"" value=""12""/> <detail unit=""sec"" value=""25""/> <detail unit=""msec"" value=""950""/> </details> </profile>"; var serializer = new XmlSerializer(typeof(Profile)); using var reader = new StringReader(xmlContent); var result = (Profile)serializer.Deserialize(reader); // 取值测试 Console.WriteLine(result.Details.Environment); // 输出 sd98qlx Console.WriteLine(result.Details.Severity); // 输出 critical Console.WriteLine(result.Details.DetailItems.Count); // 输出 3 Console.WriteLine(result.Details.DetailItems[0].Value); // 输出 12
关键特性说明
[XmlRoot]:指定类对应XML的根节点名称,避免类名与节点名不一致导致反序列化失败[XmlAttribute]:标记属性对应XML节点的属性,括号内可显式指定XML属性名,名称一致时可省略[XmlElement("detail")]:标记集合的子元素名称,序列化/反序列化时直接将集合元素作为当前节点的直接子节点,不会生成额外的嵌套集合节点,刚好匹配你给出的XML结构
内容的提问来源于stack exchange,提问作者Albert
相关产品推荐
相关产品推荐

