2017-04-11 2 views
1

Ich definiere einen neuen Vertrag für meine WEB-API, wo ich eine bestimmte XML-Formatierung haben möchte, damit sie das unten stehende XML akzeptieren kann, das ich in meinen Klassenklassen analysieren möchte. Das JSON-Format entspricht genau dem, was ich erwartet habe, XML dagegen nicht.WebAPI-Mapping-Klassen als XML

Wie höre ich auf, Wrapper-Knoten "Members" in XML zu generieren?

Die XML-I in Klassen analysieren möchten:

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

Mapping-Klassen:

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

jedoch das Beispiel hat zusätzliche Knoten gemacht, und meine ursprüngliche XML kann nicht analysiert werden. Ich habe Probe unter für die Struktur wiedergegeben hinzugefügt:

<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

Bitte werfen Sie einen Blick auf meine aktualisierte Antwort, ich hatte nicht meinen Kaffee und Mis habe dich verstanden. –

Antwort

0

Dies ist fast unmöglich, da die WebAPI die DataContractSerializer verwendet.

Wenn Sie zum XmlSerializer wechseln, können Sie folgendes tun können:

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

Sie auf Anfrage über einen attribute on your Controller wechseln könnte: es

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

Dann auf dem Controller verwenden:

[UseXmlSerializer] 
public class FooController : ApiController 
{ 
}