2012-05-11 7 views
0

次の問題に対処する必要があります。 SOAPサーバーとSOAPクライアントの両方が、SAPシステムと連携して動作します。私は、すべてのクラスを照会して、クライアントに再度渡すようにクライアントを編集し、再度送信します(私はSAPから利用可能なデータが送られてきたら、処理して出荷します)。問題は、データの読み込みと再読み込みのために生成されたプロキシクラスが少し異なることです。私は本当に確実であるための2日間を探しています!非常に機密性の高いデータがあるため、実際に失う余裕はありません。プロキシクラスをシリアライズし、他のプロキシクラスでデシリアライズ

プロキシクラスの例を次に示します。サーバーはデータを受信します。ここで

[GeneratedCode("svcutil", "3.0.4506.2152")] 
[Serializable] 
[DebuggerStepThrough] 
[DesignerCategory("code")] 
[XmlType(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")] 
public partial class _wsv_cas01d0005p0000013303Response 
{ 
    private _wsv_cas01Rs0000S[] ec_20KiField; 
    private _wsv_cas01Rs0000S[] ec_21KiField; 
    private _wsv_cas01Rs0000S[] ec_23KiField; 
    private _wsv_caSafMsgExternalS[] etMessagesField; 

    private string evCeeRequestIdField; 
    private int evStatusCodeField; 

    [XmlArray(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)] 
    [XmlArrayItem("item", Form=XmlSchemaForm.Unqualified, IsNullable=false)] 
    public _wsv_cas01Rs0000S[] Ec_20Ki 
    { 
     get 
     { 
      return this.ec_20KiField; 
     } 
     set 
     { 
      this.ec_20KiField = value; 
     } 
    } 

は、プロキシが再び充填することがある別のクラスの例です。

[GeneratedCode("svcutil", "3.0.4506.2152")] 
[Serializable] 
[DebuggerStepThrough] 
[DesignerCategor("code")] 
[XmlType(AnonymousType=true, Namespace="urn:sap-com:document:sap:soap:functions:mc-style")] 
public partial class _wsv_cas01d0005p0000013203 
{ 
    private _wsv_cas01Rq0012210001S[] ic_20KiField; 
    private _wsv_cas01Rq0012210002S[] ic_21KiField; 
    private _wsv_cas01Rq0012210003S[] ic_23KiField; 
    private string ivBoIdField; 
    private string ivBoTypeCdField; 
    private string ivCbDestinationField; 

    [XmlArray(Form=XmlSchemaForm.Unqualified, Order=0)] 
    [XmlArrayItem("item", Form=XmlSchemaForm.Unqualified, IsNullable=false)] 
    public _wsv_cas01Rq0012210001S[] Ic_20Ki 
    { 
     get 
     { 
      return this.ic_20KiField; 
     } 
     set 
     { 
      this.ic_20KiField = value; 
     } 
    } 

あなたはヘッダがすでにSOAPのために書かれている見ることができますので、私は簡単に名前を変更することはできませんとして他のクライアントの

このメソッドでは、SOAPメッセージをログに記録するために使用できるクラスのXMLコードを費やしています。ナウ、残念ながら、名前はちょうどすべて間違っています。

public static string ObjectToXml(object input) 
{ 
    string objectAsXmlString; 

    XmlSerializer xs = new XmlSerializer(input.GetType()); 
    XmlSerializerNamespaces test = new XmlSerializerNamespaces(); 
    using (StringWriter sw = new StringWriter()) 
    { 
     try 
     { 
      xs.Serialize(sw, input); 
      objectAsXmlString = sw.ToString(); 
     } 
     catch (Exception ex) 
     { 
      objectAsXmlString = ex.ToString(); 
     } 
    } 
    return objectAsXmlString; 
} 

パッケージのクライアントに送り返されたコードを読んでみてください。変更されたXMLコードで動作します!豊かな結果を考えている限り。

XmlSerializer serializer = new XmlSerializer(typeof(_wsv_cas01d0005p0000013203)); 
_wsv_cas01d0005p0000013203 Requestdaten = (_wsv_cas01d0005p0000013203)serializer.Deserialize(xmlDoc); 

これでXMLを変換する方法がなくなり、変数が存在するため、クラスを残すことができます。私はXPATHとXSDを読んでいますが、私は本当に必要なものではありませんでした。たぶんあなたの誰かがこのような似たようなケースを見たことがありますし、私のためのヒントもありますか?

PS:翻訳されたテキストの1つが読まれることを願っています。残念ながら、このような複雑なケースの私の英語は、あまりに複雑すぎます。

答えて

0

私はそれを今まで持っていましたが、最も美しい方法が解決されただけではありませんでしたが、私は解決策を使用して以来、今実現しています... "置き換え"はしませんが、最初に新しいノードに永遠に長いXMLデータがあると仮定して、元のファイルをコピーしてください... 誰かがもっとうまくいくと思ったら、すべてのヒントに感謝してください。

public static string SearchToChangeXML(string input, int changetype = 0) 
{ 
    //Replace -.- | no time, hope later more time to make better... But it works 
    input = input.Replace("<_asd_cas01d0005p0000013303Response", "<_asd_cas01d0005p0000013203"); 
    input = input.Replace("</_asd_cas01d0005p0000013303Response>", "</_asd_cas01d0005p0000013203>"); 
    for (int i = 20; i <= 40; i++) 
    { 
     input = input.Replace("<Ec_" + i.ToString() + "Ki>", "<Ic_" + i.ToString() + "Ki>"); 
     input = input.Replace("</Ec_" + i.ToString() + "Ki>", "</Ic_" + i.ToString() + "Ki>"); 
     input = input.Replace("<Ec_" + i.ToString() + "Ki />", "<Ic_" + i.ToString() + "Ki />"); 
     input = input.Replace("<Ec_" + i.ToString() + "Ki/>", "<Ic_" + i.ToString() + "Ki/>"); 
    } 

    XmlDocument xml = new XmlDocument(); 
    xml.LoadXml(input); 
    XmlNode dp = xml.DocumentElement; 
    for (int i = 0; i < dp.ChildNodes.Count; i++) 
    { 
     //Things i dont need (not all Variables are present in other Class) 
     if (dp.ChildNodes[i].Name == "Ic_38Ki" || dp.ChildNodes[i].Name == "Ic_39Ki" || dp.ChildNodes[i].Name == "EtMessages" || 
       dp.ChildNodes[i].Name == "EvCeeRequestId" || dp.ChildNodes[i].Name == "EvStatusCode") 
      dp.ChildNodes[i].RemoveAll(); 

    } 
    using (var stringWriter = new StringWriter()) 
    using (var xmlTextWriter = XmlWriter.Create(stringWriter)) 
    { 
     xml.WriteTo(xmlTextWriter); 
     xmlTextWriter.Flush(); 
     return stringWriter.GetStringBuilder().ToString(); 
    } 
} 
関連する問題