0

解決しました!! 下記参照

ベンダーのソフトウェアの API を使用しています。curl を使用して SOAP 呼び出しを行っていますが、変数に返す XML が奇妙に見えます。

print_r($response)これは、 API 呼び出しが成功した後のサーバーからの応答 の出力です。

で始まる開始タグと終了タグの ASCII 文字ではなく、エンコードされた HTML に注意してください<SearchLocations>

<また、以下の XML を ( and>の代わりに&lt;andを使用して) 変数に入れる&gt;と、スクリプトが正常に実行され、XML を解析してステップスルーし、PHP を介して表示できることに注意してください。 XML子ノードが正しく見つからないため、 「警告: 不明: ノードはもう存在しません」というエラー メッセージが表示されます。SearchLocations にハングアップしています。これにより、欠落<して>いることがわかり、問題が発生しています。

私の API 呼び出しとヘッダー:

$host = "server.myvendor.com";
$path = "/thefilefrommyhost.asmx";

function send_request_via_curl($host,$path,$content)
{
    $posturl = "https://" . $host . $path;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $posturl);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml;charset=utf-8"));
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $content);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    // curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // Not sending
    $response = curl_exec($ch);
    return $response;
}

$content = '<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetLivePostLocations xmlns="http://tempuri.org/">
<Login>SomeID</Login>
<UserName>MyUsername</UserName>
<Password>Superman</Password>
</GetLivePostLocations>
</soap:Body>
</soap:Envelope>';

$response = send_request_via_curl($host,$path,$content);


if ($response)
{ 
    // parse and display
}

返された XML:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <GetLivePostLocationsResponse xmlns="http://tempuri.org/">   
            <GetLivePostLocationsResult>&lt;SearchLocations&gt;
                &lt;Table&gt;
                &lt;LocationId&gt;1035001&lt;/LocationId&gt;
                &lt;LocationName&gt;Albuquerque, New Mexico, USA&lt;/LocationName&gt;
                &lt;/Table&gt;
                &lt;Table&gt;
                &lt;LocationId&gt;1016003&lt;/LocationId&gt;
                &lt;LocationName&gt;Atlanta, Georgia, USA&lt;/LocationName&gt;
                &lt;/Table&gt;

                &lt;/SearchLocations&gt;
            </GetLivePostLocationsResult>
        </GetLivePostLocationsResponse>
    </soap:Body>
</soap:Envelope>

そのため、HTML と ASCII の混在が問題を引き起こしているようで、なぜそのように戻ってくるのか、または回避する方法さえ理解できません。

解決しました!

さて、回避策 - html_entity_decode($response); を使用できました。

解析前は不適切な XML を修正でき、現在は機能しています!

4

1 に答える 1

1

どのコード行がエラー メッセージをスローしているかを教えていただけないため、実際の問題を特定するのは困難です。

ただし、これに対する一般的な戦略は次のとおりです。

  1. SOAP 応答を XML として解析する
  2. のテキスト コンテンツを取得する<GetLivePostLocationsResult>
  3. そのテキスト コンテンツを新しい XML ドキュメントとして解析する
  4. その 2 番目の XML ドキュメントから必要なデータを抽出します
于 2012-10-19T06:21:08.177 に答える