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

C# 如何反序列化包含嵌套列表的XML并正确读取ID的type属性

问题根源

你对Use_For_Reference节点的层级映射错误:
XML中<Usage_Data>下是多个独立的<Use_For_Reference>节点,每个<Use_For_Reference>内部才包含2个<ID>子节点。你当前的代码跳过了<Use_For_Reference>这一层,直接将<ID>映射到了Usage_Data的Use_For_Reference属性,导致反序列化逻辑匹配失败,属性无法正常填充。

修正方案

1. 新增中间类映射<Use_For_Reference>、<Type_Reference>节点,同时复用ID类减少冗余

2. 调整Usage_Data类中Use_For_Reference属性的序列化标记

修正后的完整类代码如下:

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "", IsNullable = false)]
public class Usage_Data
{
    private Usage_DataType_Data type_DataField;
    private List<Use_For_Reference> use_For_ReferenceField;
    private byte publicField;

    public Usage_DataType_Data Type_Data
    {
        get => type_DataField;
        set => type_DataField = value;
    }

    // 用XmlElement标记,对应多个同级的<Use_For_Reference>节点
    [XmlElement("Use_For_Reference")]
    public List<Use_For_Reference> Use_For_Reference
    {
        get => use_For_ReferenceField;
        set => use_For_ReferenceField = value;
    }

    [XmlAttribute]
    public byte Public
    {
        get => publicField;
        set => publicField = value;
    }
}

[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Usage_DataType_Data
{
    private Type_Reference type_ReferenceField;
    private byte primaryField;

    public Type_Reference Type_Reference
    {
        get => type_ReferenceField;
        set => type_ReferenceField = value;
    }

    [XmlAttribute]
    public byte Primary
    {
        get => primaryField;
        set => primaryField = value;
    }
}

// 新增:映射<Use_For_Reference>节点
[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Use_For_Reference
{
    private List<IdItem> idField;

    [XmlElement("ID")]
    public List<IdItem> ID
    {
        get => idField;
        set => idField = value;
    }
}

// 新增:映射<Type_Reference>节点
[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class Type_Reference
{
    private List<IdItem> idField;

    [XmlElement("ID")]
    public List<IdItem> ID
    {
        get => idField;
        set => idField = value;
    }
}

// 复用ID类,不需要重复定义
[Serializable]
[System.ComponentModel.DesignerCategory("code")]
[XmlType(AnonymousType = true)]
public class IdItem
{
    private string typeField;
    private string valueField;

    [XmlAttribute("type")]
    public string type
    {
        get => typeField;
        set => typeField = value;
    }

    [XmlText]
    public string Value
    {
        get => valueField;
        set => valueField = value;
    }
}

测试验证代码

// xmlContent为你拿到的完整响应XML字符串
var serializer = new XmlSerializer(typeof(Usage_Data));
using var reader = new StringReader(xmlContent);
var result = (Usage_Data)serializer.Deserialize(reader);

// 验证type属性正常读取
foreach (var useForRef in result.Use_For_Reference)
{
    foreach (var id in useForRef.ID)
    {
        Console.WriteLine($"type: {id.type}, value: {id.Value}");
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:06:04