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

C#反序列化含嵌套数组的XML:Array2Items为空问题解决

嵌套XML反序列化修复:Array2Items为null的解决办法

你的问题出在Array2类中对Array2Items的XML序列化特性使用错误。XML里ARRAY2节点下直接包含多个ARRAY2ITEM子元素,没有额外的数组容器节点,但你用了[XmlArrayItem]——这个特性需要配合[XmlArray]使用,用来标记外层数组节点下的子项,单独用它无法正确识别直接作为子元素的ARRAY2ITEM。

正确修改方式

把Array2类中Array2Items的[XmlArrayItem]替换为[XmlElement],指定元素名称为ARRAY2ITEM即可:

public class Array2
{
    [XmlAttribute("Array2Attr")] 
    public string Array2Attr { get; set; }
    
    // 替换XmlArrayItem为XmlElement
    [XmlElement("ARRAY2ITEM", Type = typeof(Array2Item))]
    public Array2Item[] Array2Items { get; set; }

    public Array2()
    {
    }
}

修改后的完整代码

[XmlRoot("MAINELEMENT")]
public class MainElement
{
    [XmlArray("ARRAY1")]
    [XmlArrayItem("ARRAY2", Type = typeof(Array2))]
    public Array2[] Array2s { get; set; }

    public MainElement()
    {
    }
}

public class Array2
{
    [XmlAttribute("Array2Attr")] 
    public string Array2Attr { get; set; }
    
    [XmlElement("ARRAY2ITEM", Type = typeof(Array2Item))]
    public Array2Item[] Array2Items { get; set; }

    public Array2()
    {
    }
}

public class Array2Item
{
    [XmlAttribute("Array2ItemAttr")] 
    public string Array2ItemAttr { get; set; }
    
    [XmlText] 
    public string Value { get; set; }

    public Array2Item()
    {
    }
}

验证反序列化的示例代码

你可以用以下代码测试修改后的效果:

var xmlStr = @"<MAINELEMENT>
  <ARRAY1>
    <ARRAY2 Array2Attr=""Array2Attr"">
      <ARRAY2ITEM Array2ItemAttr=""Array2ItemAttr"">Value</ARRAY2ITEM>
      <ARRAY2ITEM Array2ItemAttr=""Array2ItemAttr"">Value</ARRAY2ITEM>
    </ARRAY2>
  </ARRAY1>
</MAINELEMENT>";

var serializer = new XmlSerializer(typeof(MainElement));
using var reader = new StringReader(xmlStr);
var mainElement = (MainElement)serializer.Deserialize(reader);

// 此时mainElement.Array2s[0].Array2Items会正确包含两个元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:52:52