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

XML序列化空/Null列表时保留元素的问题求助

问题描述

在将列表序列化为XML时遇到问题:当列表为空或Null时,仍希望保留对应的XML元素,但当前实现会省略该元素。

相关代码

Car类定义

public partial class Car {
    string model;
    string brand;
} 

属性特性

[XmlArray(IsNullable = true)]
[XMLArrayItem(Car)]
public list<Car> Cars 
{
    get { return _cars; 
    set { _cars = value;
}

序列化方法

private string SerializeObject(object obj)
{
    string res;

       XmlWriterSettings writerSettings = new XmlWriterSettings();
       writerSettings.DoNotEscapeUriAttributes = true;
       writerSettings.Encoding = Encoding.UTF8;
       writerSettings.CheckCharacters = true;
       writerSettings.Indent = false;
       writerSettings.NewLineHandling = NewLineHandling.None;
       writerSettings.WriteEndDocumentOnClose = true;
       writerSettings.OmitXmlDeclaration = true;

       XmlWriterSettings xmlWriterSettings = writerSettings;
       XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType());
       StringWriter strWriter = new StringWriter();
       XmlWriter xmlWriter = XmlWriter.Create(strWriter, xmlWriterSettings);
       xmlSerializer.Serialize(xmlWriter, obj);

       var doc = XElement.Parse(strWriter.ToString());
       doc.Descendants().ToList().Where(d => d.Value.Length == 0 || d.Value == "0").Remove();
       res = doc.ToString();
       return res;
}

解决建议

1. 修正属性特性的语法错误

首先你的属性特性有两处错误:

  • XMLArrayItem 应该是大小写正确的 XmlArrayItem
  • 需要用 typeof(Car) 指定元素类型,不能直接写 Car

同时建议给列表属性添加空值兜底,确保永远不会返回Null:

[XmlArray("Cars", IsNullable = true)]
[XmlArrayItem(typeof(Car), ElementName = "Car")]
public List<Car> Cars 
{
    get { return _cars ?? new List<Car>(); }
    set { _cars = value ?? new List<Car>(); }
}

2. 移除空元素清理的致命代码

你序列化后的这行代码会直接删除所有空值或值为"0"的元素,包括空的列表容器:

// 删掉这行代码,它是导致空列表元素被移除的核心原因
doc.Descendants().ToList().Where(d => d.Value.Length == 0 || d.Value == "0").Remove();

如果确实需要清理其他空元素,要排除包含子元素的容器节点(比如列表):

// 只清理空的叶子节点,保留列表容器
doc.Descendants()
   .ToList()
   .Where(d => (d.Value.Length == 0 || d.Value == "0") && !d.HasElements)
   .Remove();

3. 验证效果

经过上述修改后:

  • 当Cars为Null时,会生成 <Cars xsi:nil="true" />
  • 当Cars为空集合时,会生成 <Cars />
    两种场景下对应的XML元素都会被保留,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:10:16