0

解决了!!见下文

我正在使用供应商软件的 API。我正在使用 curl 进行 SOAP 调用,而我返回到变量的 XML 看起来很奇怪。

print_r($response)这是成功调用 API 后来自服务器的响应 的输出。

请注意以 . 开头的开始和结束标记的编码 HTML 而不是 ASCII 字符<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 的混合似乎给我带来了问题,并且无法弄清楚为什么它会这样回来,甚至无法解决。

解决了!

好吧,一个workaroudn - 我能够使用 html_entity_decode($response);

在解析能够修复错误的 XML 之前,它现在可以工作了!

4

1 回答 1

1

很难说你的问题到底是什么,因为你没有告诉我们哪一行代码抛出了错误消息。

然而,对此的一般策略是:

  1. 将 SOAP 响应解析为 XML
  2. 获取文本内容<GetLivePostLocationsResult>
  3. 将该文本内容解析为新的 XML 文档
  4. 从第二个 XML 文档中提取您需要的任何数据
于 2012-10-19T06:21:08.177 回答