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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:15:04