只输出序列化时设置的XML元素

本文关键字:XML 元素 设置 输出 序列化 | 更新日期: 2023-09-27 18:05:15

我有以下XML:

<Line id="6">
  <item type="product" />
  <warehouse />
  <quantity type="ordered" />
  <comment type="di">Payment by credit card already received</comment>
</Line>

是否有一种方法可以在。net(2010年c#)中序列化对象时不输出未设置的元素?在我的例子中,是item type, warehouse, quantity,因此在序列化时我最终得到以下内容:

<Line id="6">
  <comment type="di">Payment by credit card already received</comment>
</Line>

我在XmlElement或xmlatattribute中看不到任何能让我实现这一点的属性。

是否需要XSD ?如果是,我该怎么做?

只输出序列化时设置的XML元素

对于简单的情况,您通常可以使用[DefaultValue]使其忽略元素。对于更复杂的情况,那么对于任何成员 Foo(属性/字段),您可以添加:

public bool ShouldSerializeFoo() {
    // TODO: return true to serialize, false to ignore
}
[XmlElement("someName");
public string Foo {get;set;}

这是一个基于名称的约定,被许多框架和序列化器支持。

例如,这只写AD:

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