【问题标题】:Web API - Self close tag instead of i:nilWeb API - 自关闭标签而不是 i:nil
【发布时间】:2014-08-17 06:43:32
【问题描述】:

我正在使用带有DataContract 序列化的Web API。 输出如下所示:

<Data>
<Status>
  <Date>2014-08-13T00:30:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T01:00:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T01:30:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>
<Status>
  <Date>2014-08-13T02:00:00</Date>
  <ID>312</ID>
  <Option>No Limitation</Option>
  <Value i:nil="true" />
</Status>

我可以通过以下方式删除所有额外的命名空间:

[DataContract(Namespace="")]
public class Status

但剩下的唯一属性是i:nil 属性。 我应该怎么做才能删除 i:nil 属性?

【问题讨论】:

  • 这能解决你的问题吗:stackoverflow.com/questions/12465285/…, DataMember(EmitDefaultValue = false)]
  • @Prescott,这将完全删除空元素。我想要的是显示没有i:nil 属性的元素。

标签: c# asp.net-web-api datacontractserializer


【解决方案1】:

你想要的是让代码“认为”它实际上有一个空字符串,而不是一个空值。你可以通过对属性 getter 稍微聪明一点来做到这一点(见下文)。请记住添加注释,解释您这样做的原因,以便维护代码的其他人知道发生了什么。

[DataContract(Namespace = "")]
public class Status
{
    [DataMember]
    public DateTime Date { get; set; }

    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Option { get; set; }

    private string value;

    [DataMember]
    public string Value
    {
        get { return this.value ?? ""; }
        set { this.value = value; }
    }
}

【讨论】:

  • 简单漂亮。这正是我所需要的,谢谢。
  • 很好,适合我。在此更改之后,我不得不将使用此值的代码从 Value != null 更改为 string.IsNullOrEmpty(Value)
【解决方案2】:

需要在DataMember属性中设置EmitDefaultValue属性

[DataMember(EmitDefaultValue = false)]

请确保不要为设置了IsRequired = true 的成员设置此属性。

编辑

您也可以手动迭代 XML 并使用 LINQ 2 XML 删除 nil 属性:

XNamespace i = "http://www.w3.org/2001/XMLSchema-instance";
        XDocument xdoc = XDocument.Load(@"XmlHere"); // This may be replaced with XElement.Parse if the XML is in-memory

        xdoc.Descendants()
                 .Where(node => (string)node.Attribute(i + "nil") == "true")
                 .Remove();

【讨论】:

  • 这将完全删除空元素,不是吗?我想显示元素,但没有 i:nil 属性。
  • 它会删除任何空元素,是的。我用手动删除指定属性的方式编辑了我的答案。
  • 你的建议是对的,但是在Web API的情况下,你不能像这样操作XML,它是一个内部序列化。
  • 您可以自己实现IXmlSerializable
  • 看看this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-16
  • 2017-11-16
  • 2014-08-09
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多