2017-04-11 110 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 
{ 
}