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

