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_cas01Rs0000012311S[] ec_20KiField;
    private _wsv_cas01Rs0000012302S[] ec_21KiField;
    private _wsv_cas01Rs0000012303S[] 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_cas01Rs0000012311S[] 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: 翻訳されたテキストの 1 つが読めることを願っています。残念ながら、このような複雑なケースに対する私の英語は、単純に複雑すぎます。

4

1 に答える 1

0

私は今それを持っています、afが解決した最も美しい方法だけでなく、URGENTソリューションを使用していたので、私は今それを実現しました...私は好きではない「交換」ですが、あなたが持っていると仮定するよりも速いと思います永遠に長い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();
    }
}
于 2012-05-15T20:36:21.540 に答える