How to exclude property name in Xml serialization

2019-08-08 21:18发布

I have a class named GetUnitResponse whose definition is as follows

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;
    }
}

I'm getting a following xml from the response(GetUnitResponse) object

<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>

Client wants the GetUnitResponse1 tag to be excluded and the resultant xml should be like below:

<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>

How to achieve this ?

1条回答
Rolldiameter
2楼-- · 2019-08-08 22:05

By default, ASP.NET Web API uses the DataContractSerializer to serialize XML. Unfortunately this serializer does not support serializing out a collection as an unwrapped list of elements. On the other hand the XmlSerializer allows for more flexible XML and more customizations.

You could instruct ASP.NET Web API to use XmlSerializer instead of the default one:

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

And now all that's left is to decorate your field with the [XmlElement] attribute:

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

    ...
}

Also for better encapsulation I would recommend you using a property instead of a field.

查看更多
登录 后发表回答