我有一个名为GetUnitResponse的类,其定义如下
public partial class GetUnitResponse { [System.ServiceModel.MessageBodyMemberAttribute(Name = "GetUnitResponse", Namespace = "", Order = 0)] [System.Xml.Serialization.XmlArrayItemAttribute("Unit", IsNullable=false)] public UnitOut[]GetUnitResponse1; public GetUnitResponse() { } public GetUnitResponse(UnitOut[] GetUnitResponse1) { this.GetUnitResponse1 = GetUnitResponse1; } }
我从响应(GetUnitResponse)对象中获取了以下xml
ID SubID Data
1 1_0 Father
2 2_0 Father
2 2_1 Child 1
3 3_0 Father
3 3_1 Child 1
3 3_2 Child 2
客户希望排除GetUnitResponse1标记,结果xml应如下所示:
<pre>
<GetUnitResponse xmlns:xsi="" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetUnitResponse1>
<Unit day="2016-01-27" ID="572">
</Unit>
<Unit day="2016-01-27" ID="573">
</Unit>
<Unit day="2016-01-27" ID="574">
</Unit>
</GetUnitResponse1>
</GetUnitResponse>
</pre>
如何实现这一目标?
答案 0 :(得分:2)
默认情况下,ASP.NET Web API使用DataContractSerializer
来序列化XML。不幸的是,这个序列化程序不支持将集合序列化为未包装的元素列表。另一方面,XmlSerializer
允许更灵活的XML和更多自定义。
您可以指示ASP.NET Web API使用XmlSerializer而不是默认值:
GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
现在剩下的就是使用[XmlElement]
属性装饰你的字段:
public partial class GetUnitResponse
{
[XmlElement("Unit")]
public UnitOut[] GetUnitResponse1;
...
}
另外,为了更好的封装,我建议您使用属性而不是字段。