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
相关产品推荐
相关产品推荐

