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属性?
需要在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; }
}
}