【问题标题】:How not to write element based on the value with XmlSerializer?如何不使用 XmlSerializer 根据值编写元素?
【发布时间】:2012-02-02 14:03:31
【问题描述】:

我可以使用 [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" />

有没有办法不获取没有任何值的元素,例如“&lt;a/&gt;”或“&lt;b/&gt;”?

【问题讨论】:

  • 那么你想要什么 XML?
  • @Austin :我想要一个没有 &lt;a/&gt;&lt;b/&gt; 的 XML,因为它们没有分配任何值。
  • Serialize a nullable int的可能重复

标签: c# xml xml-serialization


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    显然 XmlSerializer 支持 ShouldSerialize 方法:

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

    对于小班来说,这很容易,但对于大班来说,它很快就会变得凌乱和脆弱。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      相关资源
      最近更新 更多