2012-05-11 33 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代碼。不幸的是,Naur的名字完全錯了。

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:我希望可以閱讀其中的一個翻譯文本。不幸的是,對於這樣複雜的案件,我的英語太複雜了。

回答

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