我有以下XML:
<Line id="6">
<item type="product" />
<warehouse />
<quantity type="ordered" />
<comment type="di">Payment by credit card already received</comment>
</Line>
在.NET(使用C#2010)中序列化对象时,有没有办法不输出未设置的元素?在我的情况下,item type
,warehouse
,quantity
以便在序列化时最终得到以下内容:
<Line id="6">
<comment type="di">Payment by credit card already received</comment>
</Line>
我无法在XmlElement或XmlAttribute中看到任何可以让我实现此目的的属性。
是否需要XSD?如果是的话,我该怎么办呢?
答案 0 :(得分:3)
对于简单的情况,您通常可以使用[DefaultValue]
来忽略元素。对于更复杂的情况,那么对于任何成员 Foo
(属性/字段),您可以添加:
public bool ShouldSerializeFoo() {
// TODO: return true to serialize, false to ignore
}
[XmlElement("someName");
public string Foo {get;set;}
这是一个基于名称的约定,由许多框架和序列化程序支持。
例如,这只会写A
和D
:
using System;
using System.ComponentModel;
using System.Xml.Serialization;
public class MyData {
public string A { get; set; }
[DefaultValue("b")]
public string B { get; set; }
public string C { get; set; }
public bool ShouldSerializeC() => C != "c";
public string D { get; set; }
public bool ShouldSerializeD() => D != "asdas";
}
class Program {
static void Main() {
var obj = new MyData {
A = "a", B = "b", C = "c", D = "d"
};
new XmlSerializer(obj.GetType())
.Serialize(Console.Out, obj);
}
}
由于B
,省略了 [DefaultValue]
;由于C
返回ShouldSerializeC
。
false