C# XmlSerializer反序列化同名节点XML时数组为空问题求解
问题根因
反序列化得到空Rows数组的原因是XML序列化特性配置和实际XML结构不匹配:
[XmlArrayItem]特性必须搭配[XmlArray]使用,对应结构是数组外存在一层同名包裹父元素,例如<Rows><row></row><row></row></Rows>才匹配你当前的特性配置。- 你提供的XML中,
<table>下直接平铺<row>节点,<row>下直接平铺<column>节点,没有额外的数组包裹元素,序列化器无法识别到对应节点,最终得到空数组。
修正方案
仅需调整两个类的序列化特性,无需修改反序列化执行逻辑:
[Serializable, XmlRoot("table")] public class XmlDoc { [XmlElement("row")] public XmlDocRow[] Rows { get; set; } = Array.Empty<XmlDocRow>(); } public class XmlDocRow { [XmlElement("column")] public string?[] Columns { get; set; } = Array.Empty<string?>(); }
效果验证
使用你提供的示例XML反序列化后:
Rows数组长度为3,和XML中3个<row>节点一一对应- 每个
XmlDocRow实例的Columns数组长度为3 - 前两行列值分别为
"abc"/"def"/"ghi"、"jkl"/"mno"/"pqr",第三行的空<column>节点默认解析为空字符串"",满足可空字符串的处理要求。
可选配置:如果需要将空内容的
<column>节点解析为null而非空字符串,只需将Columns属性的特性修改为[XmlElement("column", IsNullable = true)]即可。
内容的提问来源于stack exchange,提问作者baouss
相关产品推荐
相关产品推荐

