禁用在C#中的Xml Serializer中发出空列表元素

时间:2016-01-22 09:17:19

标签: c# xml serialization xml-serialization

我想在List中禁用Xml中的空元素。 我知道PropertyNameSpecified模式,但我不知道如何将它应用到列表中。

我有元素列表,正在序列化。其中一些元素是空的,并且在该列表中产生空的Xml元素(我不想要的)。

我的示例代码:

public class ConditionsCollectionModel
{
    [XmlElement("forbidden")]
    public List<ForbiddenModel> ForbiddenCollection { get; set; }

    [XmlElement("required")]
    public List<RequiredModel> RequiredCollection { get; set; }
}

public class ForbiddenModel : IXmlSerializable
{
    public string Value { get; set; }
    public XmlSchema GetSchema()
    {
        return null;
    }

    public void ReadXml(XmlReader reader)
    {
        Value = reader.ReadElementString("forbidden");
    }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteString(Value);
    }
}

public class RuleModel
{
    [XmlElement("name")]
    public string Name { get; set; }
    [XmlElement("conditions")]
    public ConditionsCollectionModel Conditions { get; set; }
}

它以如下形式生成Xml:

<rule>
    <name>SR</name>
    <conditions>
        <forbidden />
        <forbidden />
        <forbidden>Ftest</forbidden>
        <required>test</required>
        <required>test2</required>
    </conditions>
</rule>

我不想在conditions列表中找到那些空元素。

2 个答案:

答案 0 :(得分:1)

问题相当陈旧,但我今天遇到了同样的问题。所以对于阅读这个主题的人来说,这是适合我的解决方案。

添加&#34; ShouldSerialize {PropertyName}&#34;

public class ConditionsCollectionModel
{
    [XmlElement("forbidden")]
    public List<ForbiddenModel> ForbiddenCollection { get; set; }

    [XmlElement("required")]
    public List<RequiredModel> RequiredCollection { get; set; }

    public bool ShouldSerializeForbiddenCollection(){
    return (ForbiddenCollection !=null && ForbiddenCollection.Count>0);

}

请参阅:MSDN

答案 1 :(得分:0)

由于ForbiddenCollection是Forbidden Class的列表,因此您可以在插入List时将空ForbiddenClass对象的值设置为null。