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

时间:2016-01-27 10:24:25

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

我有一个名为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>

如何实现这一目标?

1 个答案:

答案 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;

    ...
}

另外,为了更好的封装,我建议您使用属性而不是字段。