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

如何自定义元素名将XML反序列化为List<T>?

解决XML元素名与目标类型不匹配的反序列化问题

我懂你现在的烦恼——想把<root>包含多个<child>的XML反序列化成List<Status>,但元素名和目标类型完全对不上,又不想为了适配XML专门新建类。其实用.NET自带的XmlSerializer就能轻松搞定,核心是靠**特性(Attribute)**做名称映射就行。

具体实现步骤

  • 给你的Status类加上[XmlElement("child")]特性,告诉序列化器这个类型对应XML里的<child>元素;
  • 创建一个包含List<Status>的根类,用[XmlRoot("root")]指定根元素名称;
  • 最后用XmlSerializer正常执行反序列化操作。

完整示例代码

using System;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;

// 目标类型,通过特性映射到XML的<child>元素
public class Status
{
    [XmlAttribute("id")]
    public int Id { get; set; }

    [XmlText]
    public string Text { get; set; }
}

// 根类,对应XML的<root>元素,包含List<Status>
[XmlRoot("root")]
public class StatusRoot
{
    [XmlElement("child")] // 指定每个列表项对应<child>元素
    public List<Status> Statuses { get; set; }
}

public class Program
{
    public static void Main()
    {
        string xml = @"<root> 
<child id=""1"">Lorum</child> 
<child id=""2"">Ipsum</child> 
<child id=""3"">Dolor</child> 
</root>";

        var serializer = new XmlSerializer(typeof(StatusRoot));
        using (var reader = new StringReader(xml))
        {
            var result = (StatusRoot)serializer.Deserialize(reader);
            foreach (var status in result.Statuses)
            {
                Console.WriteLine($"Id: {status.Id}, Text: {status.Text}");
            }
        }
    }
}

代码细节说明

  • [XmlAttribute("id")]:把Status类的Id属性映射到XML元素的id属性;
  • [XmlText]:把Status类的Text属性映射到<child>元素的文本内容;
  • [XmlRoot("root")]和[XmlElement("child")]:分别指定根元素和列表项对应的XML元素名称,完美解决名称不匹配的问题。

这样你就不用额外创建和XML元素同名的类,直接用List<Status>来接收数据啦。

内容的提问来源于stack exchange,提问作者Jonas B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:37:05