求助:C#反序列化XML时仅获取到首个不同ID的属性值
解决XML反序列化仅获取第一个AddressAttribute值的问题
我来帮你搞定这个问题!看起来你在反序列化XML时只能拿到第一个AddressAttribute节点的值,这几乎可以肯定是因为你的C#实体类没有将AddressAttribute定义为集合类型(比如列表或数组),而是用了单个属性,导致XML序列化器只会读取第一个匹配节点,直接忽略后续的同名节点。
第一步:修正实体类定义
首先,我们需要调整实体类结构,让它能正确映射XML中的多个AddressAttribute节点。下面是匹配你提供的XML的完整实体类:
using System.Collections.Generic; using System.Xml.Serialization; [XmlRoot(ElementName = "Attributes")] public class Attributes { // 用XmlElement标记,告诉序列化器每个<AddressAttribute>都是直接子节点,无需外层包裹 [XmlElement(ElementName = "AddressAttribute")] public List<AddressAttribute> AddressAttributes { get; set; } } public class AddressAttribute { [XmlAttribute(AttributeName = "ID")] public int ID { get; set; } [XmlElement(ElementName = "AddressAttributeValue")] public AddressAttributeValue AddressAttributeValue { get; set; } } public class AddressAttributeValue { [XmlElement(ElementName = "Value")] public string Value { get; set; } }
第二步:反序列化并获取指定ID的Value值
接下来,使用XmlSerializer完成反序列化,然后通过LINQ查询轻松获取ID为18和17的Value值:
using System; using System.IO; using System.Linq; public class Program { public static void Main() { string xmlContent = @"<Attributes> <AddressAttribute ID=""18""><AddressAttributeValue><Value>Sala 305</Value></AddressAttributeValue></AddressAttribute> <AddressAttribute ID=""17""><AddressAttributeValue><Value>3434</Value></AddressAttributeValue></AddressAttribute> </Attributes>"; // 初始化序列化器 XmlSerializer serializer = new XmlSerializer(typeof(Attributes)); // 反序列化XML using (StringReader reader = new StringReader(xmlContent)) { Attributes attributes = (Attributes)serializer.Deserialize(reader); // 获取ID=18的Value string value18 = attributes.AddressAttributes .FirstOrDefault(attr => attr.ID == 18)? .AddressAttributeValue?.Value; // 获取ID=17的Value string value17 = attributes.AddressAttributes .FirstOrDefault(attr => attr.ID == 17)? .AddressAttributeValue?.Value; Console.WriteLine($"ID=18的Value: {value18}"); Console.WriteLine($"ID=17的Value: {value17}"); } } }
关键注意点
XmlElementvsXmlArray:因为你的XML中多个AddressAttribute是直接作为Attributes的子节点,没有外层的<AddressAttributes>包裹,所以必须用[XmlElement]标记集合属性,而不是[XmlArray]。如果用XmlArray,序列化器会期望XML有一个外层包裹节点,这会导致反序列化失败或数据丢失。- 空值处理:代码中使用了空传播运算符
?.,避免在找不到对应ID节点时抛出空引用异常,你可以根据业务需求调整这部分逻辑。
内容的提问来源于stack exchange,提问作者Saim Sajid
相关产品推荐
相关产品推荐

