"递归" (?)省略XML序列化中的空值

时间:2014-11-17 09:41:52

标签: c# xml serialization

我有一个像这样的目标XML结构:

<object>
  <children>
    <object>
      <property name="Marketingfoto">
        <value>148-41_149-41.tif</value>
      </property>
      <property name="Produkttyp">
        <value/>
      </property>
      <property name="Produktname">
        <value language="en">Sealing</value>
        <value language="de">Dichtung</value>
      </property>
      <property name="ProduktnameMehrzahl">
        <value language="en"/>
        <value language="de">Dichtungen</value>
      </property>

如您所见,有value个元素没有文字。我希望XML Serializer省略这些,因为它们占用了生成的文件中的大量空间。

此外,如果property元素中没有包含文本的任何值,则还应省略整个property元素。

所以,基本上应该&#34;递归&#34;如果没有要写的内容,则省略元素,以便生成的示例如下所示:

<object>
  <children>
    <object>
      <property name="Marketingfoto">
        <value>148-41_149-41.tif</value>
      </property>
      <property name="Produktname">
        <value language="en">Sealing</value>
        <value language="de">Dichtung</value>
      </property>
      <property name="ProduktnameMehrzahl">
        <value language="de">Dichtungen</value>
      </property>

我该如何解决这个问题?我尝试使用ShouldSerialize方法,但它似乎不适用于此特定的序列化属性组合。

课程是:

[XmlRoot("object")]
public class XmlObject
{
    [XmlArray("children")]
    [XmlArrayItem("object")]
    public List<XmlObject> Children { get; set; }

public class XmlProperty
{
    [XmlAttribute("name")]
    public string Name { get; set; }

    [XmlElement("value")]
    public List<XmlPropertyValue> Values { get; set; }

    public bool ShouldSerializeValues()
    {
        return Values != null && Values.Count > 0;
    }
}

public class XmlPropertyValue
{
    [XmlAttribute("language")]
    public string Language { get; set; }

    [XmlText]
    public string Value { get; set; }

    public bool ShouldSerializeValue()
    {
        return Value != null && !Value.Equals(String.Empty);
    }
}

1 个答案:

答案 0 :(得分:1)

我尝试以各种方式使用ShouldSerialize,而我所能得到的最好的是<value />,无法让他基本上没有序列化数组项。

但是使用自定义属性来过滤掉你不想要的东西会起作用。

[XmlIgnore]
public List<XmlPropertyValue> Values { get; set; }

[XmlElement("value")]
public List<XmlPropertyValue> ValuesForSerialization
{
    get
    {
        var bla = Values.Where(o => o.ShouldSerializeValue()).ToList();
        return bla;
    }
    set { Values = value; }
}

经测试,它有效。这不是一个简洁的解决方案,也不会将公共成员添加到您的班级(就像ShouldSerializeValue)。

根据某些sources,如果您使用ValuesForSerialization代替DataContractSerializer,则可以将XmlSerializer设为内部。