如何在 Web api 响应的 XML 序列化中排除属性名称

本文关键字:序列化 排除 属性 XML Web api 响应 | 更新日期: 2023-09-27 18:32:01

我有一个名为 GetUnitResponse 的类,其定义如下

公共分部类 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)    {        这。GetUnitResponse1 = GetUnitResponse1;    }}

我从响应(GetUnitResponse)对象中得到以下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>

客户端希望排除 GetUnitResponse1 标记,生成的 xml 应如下所示:

<pre>
<GetUnitResponse xmlns:xsi="" xmlns:xsd="http://www.w3.org/2001/XMLSchema">    
        <Unit day="2016-01-27" ID="572">
        </Unit>
        <Unit day="2016-01-27" ID="573">
        </Unit>
        <Unit day="2016-01-27" ID="574">
        </Unit>     
</GetUnitResponse>
</pre>

如何实现这一点?

如何在 Web api 响应的 XML 序列化中排除属性名称

默认情况下,ASP.NET Web API 使用该DataContractSerializer来序列化 XML。遗憾的是,此序列化程序不支持将集合序列化为解包的元素列表。另一方面,XmlSerializer允许更灵活的XML和更多的自定义。

您可以指示 Web API ASP.NET 而不是默认的序列化程序:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

现在剩下的就是用 [XmlElement] 属性装饰你的字段:

public partial class GetUnitResponse
{
    [XmlElement("Unit")]
    public UnitOut[] GetUnitResponse1;
    ...
}

同样为了更好地封装,我建议您使用属性而不是字段。