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

