尝试使用cURL获取XML响应

时间:2013-10-25 16:54:03

标签: php xml curl

我正在尝试对webservice执行POST操作,该操作应返回XML文件。之后,我正在尝试显示XML文件。我的.php目前看起来像这样:

echo "Downloading XML" . "\n";

$xml = file_get_contents('xml.xml');
$ch  = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://secure.microincasso.nl/PaymentCampaign/");
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-type: text/xml'
));

$sXML = curl_exec($ch);
curl_close($ch);

echo "sXML: " . "\n";
echo $sXML;
echo "\n" . "endof:sXML" . "\n";

echo "Parsing XML\n";
$oXML = new SimpleXMLElement($sXML);
echo "\nXML parsed\n\n";
foreach ($oXML->entry as $oEntry)
{
    echo $oEntry->title . "\n";
}

如您所见,xml.xml文件作为POST参数发送。这个XML文件是正确的。我得到的输出如下:

  

下载XML sXML:HTTP / 1.1 200 OK Transfer-Encoding:chunked   Content-Type:text / xml服务器:Microsoft-HTTPAPI / 2。0日期:10月25日星期五   2013 16:44:53 GMT f8ac1882-e219-47b7-8d5a-71f64ee04caf   https://payment.microincasso.nl/Payment/xxxxxxxxxxxxx   endof:sXML解析XML警告:SimpleXMLElement :: __ construct()   [simplexmlelement .-- construct]:实体:第1行:解析器错误:开始   标签预期,'<'在D:\ Users \ xxxxxx \ send.php上找不到   第46行

     

警告:SimpleXMLElement :: __ construct()   [simplexmlelement .-- construct]:HTTP / 1.1 200 OK   第46行的D:\ Users \ xxxxxx \ send.php

     

警告:SimpleXMLElement :: __ construct()   [simplexmlelement .-- construct]:^ in   第46行的D:\ Users \ xxxxxx \ send.php

     

致命错误:未捕获的异常'异常',消息'字符串可以   在D:\ Users \ xxxxxx \ send.php中不被解析为XML':46 Stack   跟踪:#0 D:\ Users \ xxxxxx \ send.php(46):   SimpleXMLElement-> __ construct('HTTP / 1.1 200 OK ...')#1 {main}抛出   在D:\ xxxxxx \ send.php第46行

简而言之,我想要获得的链接就是响应。响应包含我需要的东西。但是,响应似乎不是XML。如果直接导航到https://secure.microincasso.nl/PaymentCampaign/,您将看到XML。我究竟做错了什么?为什么我不在php脚本中使用XML而是使用纯文本?我如何获得原始XML?

1 个答案:

答案 0 :(得分:2)

我认为问题仍然存在于

curl_setopt($ch, CURLOPT_HEADER, 1);
来自php.net的

:“TRUE在输出中包含标题。”

如错误跟踪所示:

SimpleXMLElement-> __ construct('HTTP / 1.1 200 OK ...')#1

我认为最好取出

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');

因为你已经在做了

curl_setopt($ch, CURLOPT_POST, 1);

它是发送POST数据的正确方法