2017-10-13 20 views
1

SOAP応答に由来する配列の逆シリアル化に問題があります。これはnullを返しますが、実際には正しいxmlメッセージが表示されます。誰かが自分のコードで何が間違っているかを見ることができます。前もって感謝します。HttpClientを使用したSOAPサービスの使用

SOAP応答:

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

応答モデル:

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

解析方法:あなたは、XML LINQを使用することができ、簡単なXMLの

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

yrデシリアライズ方法がありません –

+0

私の答えをチェックしましたか? –

+0

はい、ありがとうございます。私が実際に必要としたのは、提供したモデルのようにモデルを修正することだけでした。 – George

答えて

1

理由だけではなく、その場合にはuがxDocumentと照会が必要いけない、オブジェクト全体をdeserilizeない:

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

} 

と年デシリアライズ方法:

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

をあなた場合は、以下のコードを参照してください。それでもXDocumentを使用してyrの方法で行きたいと思っています。それは大丈夫です。Deserializeメソッドは、私が定義したものと同じでなければなりません。あなたが試してみてください:

[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

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

    } 
} 
関連する問題