解决了!!见下文
我正在使用供应商软件的 API。我正在使用 curl 进行 SOAP 调用,而我返回到变量的 XML 看起来很奇怪。
print_r($response)
这是成功调用 API 后来自服务器的响应 的输出。
请注意以 . 开头的开始和结束标记的编码 HTML 而不是 ASCII 字符<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 的混合似乎给我带来了问题,并且无法弄清楚为什么它会这样回来,甚至无法解决。
解决了!
好吧,一个workaroudn - 我能够使用 html_entity_decode($response);
在解析能够修复错误的 XML 之前,它现在可以工作了!