2014-04-26 2 views
1

Je tente de désérialiser une réponse XML à partir du service db Amazons simple.Désérialise XML en objet

Le fichier XML est comme ceci.

<ListDomainsResponse xmlns="http://sdb.amazonaws.com/doc/2009-04-15/"> 
    <ListDomainsResult> 
     <DomainName>Logging</DomainName> 
     <DomainName>teets</DomainName> 
    </ListDomainsResult> 
    <ResponseMetadata> 
     <RequestId>9d48122e-1ddf-8771-b771-b36599838ea0</RequestId> 
    <BoxUsage>0.0000071759</BoxUsage> 
    </ResponseMetadata> 
</ListDomainsResponse> 

Et l'objet que j'essaie de sérialiser est celui-ci.

public class ListDomainsResponse : Response 
{ 
    public ListDomainsResult ListDomainsResult { get; set; } 
} 

public class ListDomainsResult 
{ 
    public List<String> DomainNames { get; set; } 

    public string NextToken { get; set; } 
} 

public class Response 
{ 
    public static string NameSpace = "http://sdb.amazonaws.com/doc/2009-04-15/"; 

    public ResponseMetadata ResponseMetadata{ get; set; } 
} 

public class ResponseMetadata 
{ 
    public string RequestId { get ; set; } 

    public string BoxUsage { get; set; } 
} 

Mon problème est que les métadonnées de réponse se désérialisée correctement, mais la liste des chaînes DomainName n'est pas désérialisée, il est vide à chaque fois.

Quelqu'un peut-il voir ce que je fais mal.

mis à jour avec plus de code

public async Task<Response> ListDomains (ListDomainsRequest request) 
{ 
    using (Client = new HttpClient()) { 
     ListDomainsRequestMarshaller marshaller = new ListDomainsRequestMarshaller(); 
     marshaller.Configure (request); 
     HttpResponseMessage responseMessage = Client.GetAsync (marshaller.Marshal()).Result; 
     ListDomainsResponseUnMarshaller unmarshaler = new ListDomainsResponseUnMarshaller (responseMessage); 
     return unmarshaler.Response; 
    } 
} 

public ListDomainsResponseUnMarshaller (HttpResponseMessage message) 
{ 
    XDocument doc = XDocument.Load (message.Content.ReadAsStreamAsync().Result); 

if (message.StatusCode.Equals (HttpStatusCode.OK)) { 
    Serializer = new XmlSerializer (typeof(ListDomainsResponse), Response.NameSpace); 
    Response = (ListDomainsResponse)Serializer.Deserialize (doc.CreateReader()); 
    Response.HttpStatusCode = message.StatusCode; 
    Response.ContentLength = (long)message.Content.Headers.ContentLength; 
} else { 
    Serializer = new XmlSerializer (typeof(Response)); 
    Response = (Response)Serializer.Deserialize (doc.CreateReader()); 
    Response.HttpStatusCode = message.StatusCode; 
    Response.ContentLength = (long)message.Content.Headers.ContentLength; 
} 
Serializer = null; 
} 
+1

Si vous publiez l'extrait incriminé du proxy généré, nous serons en mesure de vous aider à mieux. – Artel

+0

Comme demandé plus de code. –

Répondre

0

Ajout d'attributs aidé

[System.Xml.Serialization.XmlTypeAttribute (Namespace = "http://sdb.amazonaws.com/doc/2009-04-15/")] 
[System.Xml.Serialization.XmlRootAttribute ("ListDomainsResponse", Namespace = "http://sdb.amazonaws.com/doc/2009-04-15/")] 
public class ListDomainsResponse : Response 
{ 
    public ListDomainsResult ListDomainsResult { get; set; } 
} 

[System.Xml.Serialization.XmlTypeAttribute (Namespace = "http://sdb.amazonaws.com/doc/2009-04-15/")] 
[System.Xml.Serialization.XmlRootAttribute (Namespace = "http://sdb.amazonaws.com/doc/2009-04-15/")] 
public class ListDomainsResult 
{ 
    [System.Xml.Serialization.XmlElementAttribute ("DomainName")] 
    public string[] DomainName { get; set; } 

    public string NextToken { get; set; } 
} 
+0

Je suis content que vous ayez réussi à faire fonctionner ça. Juste une question. Pourquoi svcutil n'a-t-il pas généré ces attributs automatiquement pour vous? – Artel

+0

Son REST pas SOAP, j'ai fait comment jamais trouvé un wsdl pour leur service SOAP déprécié que j'ai utilisé pour générer un proxy et juste c/p les attributs;) –