2017-10-13 1 views
1

Verbrauch Ich habe ein Problem mit der Deserialisierung eines Arrays, die von der SOAP-Antwort kommt. Es gibt null zurück, aber als Antwort kann ich tatsächlich eine korrekte XML-Nachricht sehen. Vielleicht kann jemand sehen, was in meinem Code nicht stimmt. Danke im Voraus.Einen SOAP-Service mit HttpClient

SOAP-Antwort:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns-wp="imcwp" xmlns:ns-hostax="imchostax" xmlns:ns-ilms="imcilms" xmlns:ns-qtms="imcqtms" xmlns:ns-tptms="imctptms"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns-wp:strTrailerRequest-TrailerResponse> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T001</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T002</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     <ns-wp:Trailer> 
      <ns-wp:TrailerId>T003</ns-wp:TrailerId> 
      <ns-wp:TrailerType>Flat Extender</ns-wp:TrailerType> 
     </ns-wp:Trailer> 
     </ns-wp:strTrailerRequest-TrailerResponse> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Antwort Modell:

[XmlRoot(ElementName = "strTrailerRequest-TrailerResponse", Namespace = "imcwp")] 
public class strTrailerRequestTrailerResponse 
{ 
    [XmlArray("strTrailerRequest-TrailerResponse", Namespace = "imcwp")] 
    [XmlArrayItem("Trailer", Namespace = "imcwp")] 
    public List<Trailer> Trailers { get; set; } 
} 

Parse Methode:

private strTrailerRequestTrailerResponse ParseTrailerResponse(string response) 
    { 
     var soap = XDocument.Parse(response); 
     XNamespace ns = "imcwp"; 

     var trailerResponseNode = soap.Descendants(ns + "strTrailerRequest-TrailerResponse").FirstOrDefault().ToString(); 
     var result = Deserialize<strTrailerRequestTrailerResponse>(trailerResponseNode); 

     return result; 
    } 
+0

Jahr Deserialize Methode fehlt –

+0

hast du meine Antwort überprüft? –

+0

ja, danke. Alles, was ich wirklich brauche, ist, das Modell so zu modifizieren, dass es wie das von Ihnen angebotene aussieht. – George

Antwort

1

Warum nicht einfach das ganze Objekt deserilize, in diesem Fall u dont brauchen XDocument und anfragende:

var envelop = Deserialize<Envelope>(response); 
foreach (var strTrailerRequestTrailerResponseTrailer in envelop.Body.strTrailerRequestTrailerResponse) 
{ 

} 

und yr Deserialize Methode:

public static T Deserialize<T>(string response) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    using(TextReader reader = new StringReader(response)) 
    { 
     return (T)serializer.Deserialize(reader); 
    } 
} 

Wenn Sie will immer noch mit yr Weg mit XDocument gehen, es ist in Ordnung yr Deserialize Methode sollte das gleiche wie ich definiert. Wenn Sie nicht versuchen:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "imcwp")] 
public partial class strTrailerRequestTrailerResponseTrailer 
{ 
    public string TrailerId { get; set; } 

    public string TrailerType { get; set; } 
} 

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "imcwp")] 
[System.Xml.Serialization.XmlRootAttribute("strTrailerRequest-TrailerResponse", Namespace = "imcwp", IsNullable = false)] 
public partial class strTrailerRequestTrailerResponse 
{ 
    [System.Xml.Serialization.XmlElementAttribute("Trailer")] 
    public strTrailerRequestTrailerResponseTrailer[] Trailer { get; set; } 
} 
0

Für einfache xml Sie xml Linq verwenden können. Siehe Code unten:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Xml; 
using System.Xml.Linq; 
using System.IO; 

namespace Certificate 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      string xml = File.ReadAllText(FILENAME); 
      XDocument doc = XDocument.Parse(xml); 

      XElement soap = doc.Root; 
      XNamespace ns = soap.GetNamespaceOfPrefix("ns-wp"); 


      List<Trailer> trailers = doc.Descendants(ns + "Trailer").Select(x => new Trailer() 
      { 
       trailerId = (string)x.Element(ns + "TrailerId"), 
       trailerType = (string)x.Element(ns + "TrailerType") 
      }).ToList(); 
     } 

    } 
    public class Trailer 
    { 
     public string trailerId { get; set; } 
     public string trailerType { get;set;} 

    } 
}