1

これが私のコードです:

private void button1_Click(object sender, EventArgs e)
    {
        var process = new com.globalpay.certapia.GlobalPayments();
        var response = process.ProcessCreditCard("xxxxxx", "xxxxxx", "Sale",
            textBox1.Text, textBox2.Text, "", "", textBox3.Text, "",
            "", "", "", "", "");

        MessageBox.Show("RespMSG: " + response.RespMSG
            + "\nMessage: " + response.Message
            + "\nAuthCode: " + response.AuthCode
            + "\nPNRef: " + response.PNRef
            + "\nHostCode: " + response.HostCode
            + "\nCVResultTXT: " + response.GetCVResultTXT
            + "\nCommercialCard: " + response.GetCommercialCard
            + "\nExtData: " + response.ExtData);
    }

出力は次のようになります。

ここに画像の説明を入力

ExtData の部分で、CardType、BatchNum、MID、TransID の値を取得するなど、これらの値を抽出する方法がわかりません。

どうすればそれらの値を抽出できますか?

どうすればこれを達成できるかについてのアドバイスや提案は、大きな助けになります。ありがとう!

APIのドキュメントに基づいています:

 <?xml version="1.0" encoding="utf-8" ?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="GlobalPayments">
<Result>0</Result>
<RespMSG>Approved</RespMSG>
<Message>AP</Message>
<AuthCode>000014</AuthCode>
<PNRef>564286</PNRef>
<HostCode>0032</HostCode>
<GetCVResultTXT>Service Not Requested</GetCVResultTXT>
<GetCommercialCard>False</GetCommercialCard>
<ExtData>InvNum=1234567900,CardType=MasterCard,BatchNum=0011<BatchNum>0011
</BatchNum><ReceiptData><MID>4910354</MID><Trans_Id>MCC1421250315
</Trans_Id></ReceiptData></ExtData>
</Response>
4

3 に答える 3

2

応答が文字列または文字列に変換できるものであると仮定すると、LINQを使用するのが最も簡単な方法です。

// XDocument.Parse will load a string into the XDocument object.
XDocument xDoc = XDocument.Parse(response);
// XNamespace is required in order to parse the document.
XNamespace ns = "GlobalPayments";

var resp = (from x in xDoc.Descendants(ns + "ExtData")
            select new
            {
                ExtData = x.Value,
                BatchNum = x.Element(ns + "BatchNum").Value,
                MID = x.Element(ns + "MID").Value,
                TransID = x.Element(ns + "TransID").Value
            }).SingleOrDefault();

次に、次のプロパティを持つ匿名タイプ(resp)が作成されます。

resp.ExtData = "InvNum=1234567900,CardType=MasterCard,BatchNum=0011"
resp.BatchNum = "0011"
resp.MID = "4910354"
resp.TransID = "MCC1421250315"

次に、ExtDataで通常のString.Split操作を使用して、必要な文字列からデータを取得できます。

最も美しい解決策ではありませんが、力ずくの方法が必要になる場合があります。ニーズ/好みに合わせて採用および変更します。

于 2013-01-13T07:28:38.043 に答える
2

これは、応答の形式が正しくない場合のようです。これは、この種の Web サービスではよくあることです。すぐに良くなるとは思わないでください。

解析を力ずくで行う必要があり、解析が変更されないこと、または取得した応答の種類に基づいて変更されることを期待するだけです。

一般的なアルゴリズムは次のとおりです。

  1. 2 つの異なるパーツを分離する
    • カンマ区切りの等値部分
    • XML 形式のパーツ
    • これは、おそらく「<」の最初のインデックスを見つけて、この場所で文字列を2つに分割することで実行できます
  2. 異なるアルゴリズムで 2 つの部分を解析します。最初のケースでは、解析は問題になりません。「,」と「=」で分割するだけで、キーと値のペアが得られます。2 番目のケースでは、XML 解析ライブラリを使用して支援する必要があります。ここでも、多数のキーと値のペアを取得します。
  3. すべてのキーと値のペアを文字列/文字列辞書に入れます。
于 2013-01-13T06:48:12.983 に答える
1

String.IndexOf ..)を使用して手動で抽出し、次にString.SubString(..)などを使用して抽出する必要があります。

var cardType = data.Substring(data.IndexOf("<BatchNum>"), data.IndexOf("</BatchNum>") - data.IndexOf("<BatchNum>"));

もちろんコードを処理するいくつかの例外を除いて...

于 2013-01-13T06:44:44.713 に答える