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

C#中XML反序列化为何始终返回NULL值?

问题原因与解决方案

你的代码反序列化后属性全为null,核心问题是类结构和XML的层级完全不匹配:

  1. XML里的Id/Bool/Title/Something是<Item>节点的子元素,而非根节点<ArrayOfSomething>的属性,但你给ArrayOfSomething的属性加了[XmlAttribute]特性,相当于告诉序列化器去根节点的属性里找这些值,自然找不到。
  2. 根节点<ArrayOfSomething>包含多个<Item>子节点,但你的ArrayOfSomething类没有定义对应的集合属性来承载这些Item。

修正后的代码实现

1. 定义正确的实体类

[XmlRoot("ArrayOfSomething")]
public class ArrayOfSomething
{
    // 用XmlElement指定每个子节点名称为Item,序列化器会自动识别多个Item节点
    [XmlElement("Item")]
    public List<Item> Items { get; set; } = new List<Item>();
}

// 定义Item类,对应XML里的每个Item节点
public class Item
{
    // 名称和XML子元素一致,可省略XmlElement特性,如需自定义名称再添加
    public string Id { get; set; }
    public string Bool { get; set; }
    public string Title { get; set; }
    public string Something { get; set; }
}

2. 反序列化代码(可保留命名空间忽略逻辑,或直接移除)

public void Run()
{
    XmlSerializer serializer = new XmlSerializer(typeof(ArrayOfSomething));
    string xmlContent = @"<ArrayOfSomething xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                  xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
    <Item>
        <Id>0</Id>
        <Bool>false</Bool>
        <Title>Some text</Title>
        <Something/>
    </Item>
    <Item>
        <Id>0</Id>
        <Bool>false</Bool>
        <Title>Some text 2</Title>
        <Something/>
    </Item>
    <Item>
        <Id>0</Id>
        <Bool>false</Bool>
        <Title>Some text 3</Title>
        <Something/>
    </Item>
    <Item>
        <Id>0</Id>
        <Bool>false</Bool>
        <Title>Some text 4</Title>
        <Something/>
    </Item>
</ArrayOfSomething>";

    using StringReader sr = new StringReader(xmlContent);
    // 不需要忽略命名空间的话,直接用sr反序列化即可
    // var s = (ArrayOfSomething)serializer.Deserialize(sr);
    
    // 保留命名空间忽略逻辑的话
    using NamespaceIgnorantXmlTextReader XMLWithoutNamespace = new NamespaceIgnorantXmlTextReader(sr);
    var s = (ArrayOfSomething)serializer.Deserialize(XMLWithoutNamespace);
    
    // 此时s.Items会包含4个Item对象,每个Item的属性都能正确赋值
}

额外说明

  • 如果你原本误以为XML里的字段是根节点的属性,那XML结构应该是类似<ArrayOfSomething Id="0" Bool="false" ...>这种格式,才需要用[XmlAttribute]。
  • 序列化器匹配规则是严格对应XML的节点层级和类型,务必保证类结构和XML结构一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:50