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

求助: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}");
        }
    }
}

关键注意点

  • XmlElement vs XmlArray:因为你的XML中多个AddressAttribute是直接作为Attributes的子节点,没有外层的<AddressAttributes>包裹,所以必须用[XmlElement]标记集合属性,而不是[XmlArray]。如果用XmlArray,序列化器会期望XML有一个外层包裹节点,这会导致反序列化失败或数据丢失。
  • 空值处理:代码中使用了空传播运算符?.,避免在找不到对应ID节点时抛出空引用异常,你可以根据业务需求调整这部分逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:27:54