解決しました!! 下記参照
ベンダーのソフトウェアの API を使用しています。curl を使用して SOAP 呼び出しを行っていますが、変数に返す XML が奇妙に見えます。
print_r($response)
これは、 API 呼び出しが成功した後のサーバーからの応答 の出力です。
で始まる開始タグと終了タグの ASCII 文字ではなく、エンコードされた HTML に注意してください<SearchLocations>
。
<
また、以下の XML を ( and>
の代わりに<
andを使用して) 変数に入れる>
と、スクリプトが正常に実行され、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><SearchLocations>
<Table>
<LocationId>1035001</LocationId>
<LocationName>Albuquerque, New Mexico, USA</LocationName>
</Table>
<Table>
<LocationId>1016003</LocationId>
<LocationName>Atlanta, Georgia, USA</LocationName>
</Table>
</SearchLocations>
</GetLivePostLocationsResult>
</GetLivePostLocationsResponse>
</soap:Body>
</soap:Envelope>
そのため、HTML と ASCII の混在が問題を引き起こしているようで、なぜそのように戻ってくるのか、または回避する方法さえ理解できません。
解決しました!
さて、回避策 - html_entity_decode($response); を使用できました。
解析前は不適切な XML を修正でき、現在は機能しています!