2017-04-11 64 views
1

我正在为我的WEB API定义新合同,我想要具有特定的XML格式,以便它可以接受下面的XML,我将在下面解析我的类类。 JSON格式完全符合我的预期,但XML不是。WebAPI映射类作为xml

如何停止在XML中生成“成员”包装节点?

我想解析成类的XML:

<MembersUpdate> 
<NotificationUrl>http://yoururl/member/profile/</NotificationUrl> 
<Timestamp >2017-04-11T12:13:35.6516915Z</Timestamp> 
<Member> 
    <MemberId>0</MemberId> 
    <LastUpdated>0001-01-01T00:00:00</LastUpdated> 
</Member> 
<Member> 
    <MemberId>0</MemberId> 
    <LastUpdated>0001-01-01T00:00:00</LastUpdated> 
</Member> 
<Member> 
    <MemberId>0</MemberId> 
    <LastUpdated>0001-01-01T00:00:00</LastUpdated> 
</Member> 
<Member> 
    <MemberId>0</MemberId> 
    <LastUpdated>0001-01-01T00:00:00</LastUpdated> 
</Member> 
</MembersUpdate> 

类映射:

/// <remarks/> 
[DataContract] 
public partial class MembersUpdate 
{ 
    /// <remarks/> 
    [DataMember] 
    public string NotificationUrl { get; set; } 

    /// <remarks/> 
    [DataMember] 
    public System.DateTime Timestamp { get; set; } 

    /// <remarks/> 
    [DataMember] 
    public MembersUpdateMember[] Member { get; set; } 
} 

/// <remarks/> 
[DataContract] 
public partial class MembersUpdateMember 
{ 
    /// <remarks/> 
    [DataMember] 
    public byte MemberId { get; set; } 

    /// <remarks/> 
    [DataMember] 
    public System.DateTime LastUpdated { get; set; } 
} 

但是呈现的例子确实有额外的节点,和我原来的XML无法解析。我已经加入呈现下面的结构示例:

<MembersUpdate xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/CivicaSystemsLtd.Areas.Notices.ApiControllers"> 
     <Member> 
     <MembersUpdateMember> 
      <LastUpdated>2017-04-11T23:58:06.6310087+01:00</LastUpdated> 
      <MemberId>64</MemberId> 
     </MembersUpdateMember> 
     <MembersUpdateMember> 
      <LastUpdated>2017-04-11T23:58:06.6310087+01:00</LastUpdated> 
      <MemberId>64</MemberId> 
     </MembersUpdateMember> 
     </Member> 
     <NotificationUrl>sample string 1</NotificationUrl> 
     <Timestamp>2017-04-11T23:58:06.6300095+01:00</Timestamp> 
    </MembersUpdate> 
+0

请看看我更新的答案,我没有喝过咖啡,了解你。 –

回答

0

这几乎是不可能的,因为的WebAPI使用DataContractSerializer

如果你可以切换到XmlSerializer,你可以做到以下几点:

[XmlElement(ElementName = "Member")] 
public MembersUpdateMember[] Member { get; set; } 

你可以根据需要通过attribute on your Controller切换:

public class UseXmlSerializerAttribute : Attribute, IControllerConfiguration 
{ 
    public void Initialize(HttpControllerSettings controllerSettings, 
          HttpControllerDescriptor controllerDescriptor) 
    { 
     var xmlFormater = new XmlMediaTypeFormatter {UseXmlSerializer = true}; 

     controllerSettings.Formatters.Clear(); 
     controllerSettings.Formatters.Add(xmlFormater); 
    } 
} 

然后使用控制器上:

[UseXmlSerializer] 
public class FooController : ApiController 
{ 
}