C#XmlSerializer有条件地序列化List <t>项

时间:2019-01-18 15:20:07

标签: c# xml xmlserializer

我需要使用C#XmlSerializer对XML进行序列化和反序列化(或者有更好的方法吗?)。

 
[XmlElement]
public virtual List<Map> Maps { get; set; }

public class Map
{
    [XmlAttribute("item")]
    public string Item { get; set; }

    [XmlAttribute("uri")]
    public string Uri { get; set; }
}

Maps = new List<Map>{
    new Map { Item="", Uri="" },
    new Map { Item="something", Uri="foo" },
    new Map { Item="", Uri="foo" },
}

序列化程序应丢弃带有string.IsNullOrEmpty(map.Item)的每个项目,以便生成的Xml仅保存带有“某物”的映射。 我如何才能毫不费力地实现这一目标?:  

<Maps> <Map item="something" uri="foo" /> </Maps>

2 个答案:

答案 0 :(得分:0)

好吧,您可以尝试创建XmlWriter,该过滤器过滤掉所有带有xsi:nil属性或包含空字符串的元素,并将所有其他调用传递给基础标准XmlWriter,以“清理”序列化的XML。

答案 1 :(得分:0)

据我了解,您希望在序列化XML之前对其进行过滤。

我建议您使用LINQ

var filteredMaps = Maps.Where(map => !string.IsNullOrWhiteSpace(map.Item)).ToList();

请注意在行尾的.ToList()调用。这很重要,因为我想您的XmlSerializer类型为List<Map>。在序列化对象之前放置此行,结果应如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Map item="something" uri="foo" />
</ArrayOfMap>

别忘了using System.Linq;