Php 更新:API调用返回XML,混合使用ASCII和HTML字符,用于打开和关闭元素上的标记(并导致问题)

Php 更新:API调用返回XML,混合使用ASCII和HTML字符,用于打开和关闭元素上的标记(并导致问题),php,xml,api,soap,encoding,Php,Xml,Api,Soap,Encoding,解决了!!见下文 我正在使用一个供应商软件的API。我使用curl进行SOAP调用,返回变量的XML看起来很奇怪 这是print\r($response)的输出,它是成功调用API后服务器的响应 注意以SearchLocations开头的开始和结束标记的编码HTML而不是ASCII字符 还要注意的是,当我将下面的XML放入一个变量(使用而不是和)时,我的脚本运行良好,我能够解析和逐步遍历XML并通过PHP显示它-但由于某种原因,使用此XML我会得到“警告:未知:节点在中不再存在”错误消息,因为它

解决了!!见下文

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

这是
print\r($response)
的输出,它是成功调用API后服务器的响应

注意以
SearchLocations
开头的开始和结束标记的编码HTML而不是ASCII字符

还要注意的是,当我将下面的XML放入一个变量(使用
而不是
)时,我的脚本运行良好,我能够解析和逐步遍历XML并通过PHP显示它-但由于某种原因,使用此XML我会得到“警告:未知:节点在中不再存在”错误消息,因为它无法正确找到子节点。它挂在搜索位置上,这告诉我丢失的
导致了问题

我的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
}
$host=“server.myvendor.com”;
$path=“/thefilefrommyhost.asmx”;
函数send_request_via_curl($host、$path、$content)
{
$postrl=“https://”$host.$path;
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$postrl);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HTTPHEADER,数组(“内容类型:text/xml;charset=utf-8”);
curl_setopt($ch,CURLOPT_头,false);
curl_setopt($ch,CURLOPT_POSTFIELDS,$content);
卷曲设置($ch,卷曲设置桩,1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0);
//curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);//不发送
$response=curl\u exec($ch);
返回$response;
}
$content='1
某物
我的用户名
超人
';
$response=send_request_via_curl($host,$path,$content);
如果($答复)
{ 
//解析和显示
}
返回的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>

搜索地点
桌子
LocationId1035001/LocationId
地点名称美国新墨西哥州阿尔伯克基/地点名称
/桌子
桌子
位置ID1016003/位置ID
地点名称美国佐治亚州亚特兰大/地点名称
/桌子
/搜索地点
因此,HTML和ASCII的混合似乎给我带来了一些问题,我不明白为什么会出现这种情况,甚至不知道如何解决

解决了

嗯,一个变通办法-我可以使用 html_实体_解码($response)


在解析之前,我们能够修复坏的XML,现在它可以工作了

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

然而,这方面的总体战略是:

  • 将SOAP响应解析为XML
  • 获取
  • 将该文本内容解析为新的XML文档
  • 从第二个XML文档中提取所需的任何数据

  • 谢谢你考虑一下。事实上,我只是把它搞乱了(只花了9个小时,庆幸没有更多!)。我不知道为什么我会从Windows SOAP服务器上收到垃圾,但是在解析之前使用html_entity_decode($response)能够修复错误的XML,现在它可以工作了@916Networks——这使得(危险的)假设SOAP响应中唯一的字符引用将是将整个XML文档嵌入到另一个XML文档中。不要那样做。响应没有中断。它由一个XML文档作为另一个文档中的数据组成。照此处理,依次解析每个文档。