Web API -自关闭标记代替i:nil

本文关键字:nil API Web | 更新日期: 2023-09-27 18:18:14

我使用Web API与DataContract序列化。输出如下所示:

<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属性?

Web API -自关闭标记代替i:nil

需要在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();

您想要的是使代码"认为"不是具有空值,而是具有空字符串。你可以通过稍微聪明一点的使用属性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; }
    }
}