2011-01-23 13 views
4

私には問題があり、それから抜け出せません。 WebServicesについての私の知識は素晴らしいことではありません。私は解決しなければならない少しの問題があります。 私はWebサービスのクライアントを開発していますが、私はサーバー側のWebサービス(と私はそれがJavaで開発されていると思う)以上の力はありません。私はWSE3を使用してクライアントをベースにしていますが、解決できないいくつかの方法を除いてはかなりうまくいくようです。 私のWSDL定義に基づいて、私はプロキシクラスを生成し、適切なデータ型と呼び出しメソッドを生成しました。これらのメソッドの多くは、適切なオブジェクト型にキャストされた、すでにデシリアライズされたSOAPメッセージを返します。残念ながら、それらのうちのいくつかは、あまり整形されていないXMLファイルを内部に含むZIPファイルのバイト配列を返します。ストリームを取得し、ファイルを解凍してxmlを読み込むことができましたが、xmlを適切に非直列化してからそれぞれの型にキャストすることはできません。これは私のコードの例であり、逆シリアル化して適切な型にキャストする必要があるxmlの例です。何か提案はありますか?私は、このデータを含む文字列のリスト<>を持って終わり特定のXML文字列を逆シリアル化する

MyClient client = new MyClient(ServiceSettings); 
ConnectResponseRetrieveMyType data; 

try 
{ 
    // call web service method 
    data = client.syncData(service, startDate, endDate); 

    // unzip the byte array 
    using (ZipFile zip = ZipFile.Read(data.Data)) 
    { 
     if (zip.ContainsEntry("data.xml")) 
     { 
      List<string> strings = new List<string>(); 

      // read the xml file with multiple root elements 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ConformanceLevel = ConformanceLevel.Fragment; 

      using (XmlReader reader = XmlReader.Create(zip["data.xml"].OpenReader(), settings)) 
      { 
       while (reader.Read()) 
       { 
        strings.Add(reader.ReadOuterXml()); 
       } 
      } 

     } 
     else 
      return "OGZIP01"; 
    } 
} 

<c:CoverDecision TypeOfCover="CreditLimit" CoverId="123123123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:c="http://atradius.com/connect/_2007_08/" xmlns:o="http://atradius.com/organisation/_2007_08/type/"> 
    <Buyer> 
     <o:Identifier registeredOffice="SYMPH"> 
      <o:id>123123123</o:id> 
      <o:countryTypeIdentifier>AUT</o:countryTypeIdentifier> 
     </o:Identifier> 
     <o:Identifier registeredOffice="COC"> 
      <o:id>123123123F</o:id> 
      <o:countryTypeIdentifier>AUT</o:countryTypeIdentifier> 
     </o:Identifier> 
     <o:Name> 
      <o:name>SOME GES.M.B.H.</o:name> 
      <o:type>REG</o:type> 
     </o:Name> 
     <o:LegalForm>GMBH</o:LegalForm> 
     <o:Address> 
      <o:StreetDescription xsi:type="xsd:string">STRAßE 49</o:StreetDescription> 
      <o:City>FÜRSTENFELD</o:City> 
      <o:PostCode>23123</o:PostCode> 
      <o:CountryISOCode>AUT</o:CountryISOCode> 
     </o:Address> 
    </Buyer> 
    <Customer> 
     <o:Identifier registeredOffice="SYMPH"> 
      <o:id>123123</o:id> 
      <o:countryTypeIdentifier>NLD</o:countryTypeIdentifier> 
     </o:Identifier> 
     <o:Identifier registeredOffice="COC"> 
      <o:id>123123</o:id> 
      <o:countryTypeIdentifier>NLD</o:countryTypeIdentifier> 
     </o:Identifier> 
     <o:Name> 
      <o:name>SOME B.V.</o:name> 
      <o:type>REG</o:type> 
     </o:Name> 
    </Customer> 
    <PolicyId>123123</PolicyId> 
    <GenericApplication> 
     <CustomerReference>123123</CustomerReference> 
     <EntryDate>2010-02-04</EntryDate> 
     <Supersede>false</Supersede> 
    </GenericApplication> 
    <Decision> 
     <ApplicationResult>CreditLimitDecision</ApplicationResult> 
     <DecisionDate>2010-02-05</DecisionDate> 
     <EffectFrom>2010-02-05</EffectFrom> 
     <EffectTo>2010-07-19</EffectTo> 
     <CreditLimitDecision> 
      <CreditLimitResultCode>APPR</CreditLimitResultCode> 
      <DecisionCode>DC16</DecisionCode> 
      <FirstAmount> 
       <Amount>150000.00</Amount> 
       <Conditions> 
        <TypeOfConditions>ADMIN</TypeOfConditions> 
        <ConditionCode>T310</ConditionCode> 
        <ConditionText>Some condition description text.</ConditionText> 
       </Conditions> 
      </FirstAmount> 
      <SecondAmount> 
       <Amount>0</Amount> 
      </SecondAmount> 
     </CreditLimitDecision> 
    </Decision> 
</c:CoverDecision> 

そして、私はそれをデシリアライズし、適切なオブジェクトの型にキャストすることができませんでしだ。私は多くのアプローチを試みましたが、失敗しました。おそらくあなたは何か提案がありますか?

ありがとうございます。

答えて

1

答えを得ました。タンクヤン! XmlSerializerは、名前空間とルート要素の処理方法を認識していませんでした。

この属性は、この問題を解決するのに役立ちます。

[System.Xml.Serialization.XmlRootAttribute("CoverDecision", Namespace = "http://atradius.com/connect/_2007_08/", IsNullable = false)] 
public partial class CoverDecisionType 

私はブレインストーミングを手伝ったすべての人に感謝します!

1

はい、xmlはフォーマットされていません。 各 'identifier'要素は '識別子'の内側にあったはずです。それは他のタイプの非常に単純であること以外は

(識別子のために、バイヤーや消費者のタイプでList<Identifier>を作成します。

最も簡単な方法は、データがDataSet.ReadXml(xmlfile); を使用することで、データがロードされると読むために、

リレーション(dataSet.Relations)の関係を利用してテーブルをナビゲートすると、「CoverDecision」、「Buyer」、「Identifier」などの表が表示され、すべてのデータを取得することができます。

+0

あなたの回答へのリプレイはコメントには長すぎるので、私は私の質問に答えます。ありがとう –

1

Vijay Sirigiriへのスポンサー。

リピートをありがとう。私はすでにその解決策を試して、それは正常に動作します:

using (XmlReader reader = XmlReader.Create(zip["data.xml"].OpenReader(), settings)) 
{ 
while (reader.Read()) 
{ 
    ds.ReadXml(reader); 
    ... 

それはあなたと同じように動作します。別のものが見つからなければ、これはリバウンドの解決策になる可能性があります。

好奇心をそそる問題は、私がCoverDecisionを1つ与えるはずのWSのメソッドを思い出すと、適切なオブジェクトを逆シリアル化してキャストしたということです。 WSE3がそのオブジェクトを逆シリアル化するのと同じ動作を複製することは可能でしょうか? 例では、これが正常に動作し、私はWSメソッドを呼び出すと、私はConnectResponseType(SOAPResponseを)取り戻す含まれる:

CoverDecisionType response = SOAPResponse.CoverDecision; 

をそれを行う方法についての手掛かりをお持ちですか?

+0

"リコール"とは何ですか?サービスがデータ(data.xml)をシリアライズすることができれば、この型があるかもしれないが、公開されていないかどうか、この質問がありましたか?あなたは、これらの型 - CoverDecisionTypeとothesを返すメソッドがあると言っていますか? –

+0

webserviceには複数のメソッドがあります。それらのうちのいくつかは、CoverDecisionTypeを返します(そして、トレースを調べると、CoverDecision本体にあるSOAPメッセージがあります)。そのメソッドの呼び出し後にWSEがCoverDecisionTypeを返します。これらの方法のうちの1つ(問題のあるもの)の1つは、有害なXMLを含むZIPファイルを返します。 List に逆シリアル化したいのですが、不可能と思われます。私はいろいろなテクニックを試みましたが、まだ何もありません。 –

関連する問題