如何不使用XmlSerializer基于值编写元素?

时间:2012-01-04 17:03:04

标签: c# xml xml-serialization

我可以使用[XmlIgnore]以便不写元素,但是如何根据变量的内容来控制它呢?

例如,当值为null时,我不想写XML元素。

[XmlRootAttribute("Component", IsNullable = true)]
public class Component {
    [XmlArrayAttribute("worlds_wola", IsNullable = true)]
    public List<Hello> worlds;      
    public int? a = null;
    public int? b = null;

    public Component()
    {
        worlds = new List<Hello>() {new Hello(), new Hello()}; 
    }
}

但是,我得到了这个XML。

<worlds_wola>
  ...
</worlds_wola>
<a xsi:nil="true" />
<b xsi:nil="true" />

有没有办法不让一个没有任何价值的元素,比如“<a/>”或“<b/>”?

2 个答案:

答案 0 :(得分:2)

如果aSpecified不应该是生成的xml的一部分,请包含名称为bool的属性并输入false并返回a

public bool aSpecified
{
    get { return this.a.HasValue; }
}

另请参阅:https://stackoverflow.com/a/246359/295635

答案 1 :(得分:1)

显然XmlSerializer支持ShouldSerialize方法:

您还可以将自定义序列化代码与IXmlSerializable或ISerializable一起使用。

对于小班级来说,这很容易,但是对于较大的案例,它很快就会变得混乱和脆弱。

您也可以使用XmlSerializer构造函数来根据您的具体情况进行属性覆盖: