我有一个像这样的目标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);
}
}
答案 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
设为内部。