尝试使用 cURL 获取 XML 响应


Trying to get XML response using cURL

我正在尝试在Web服务上执行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 传输编码: 分块 内容类型:文本/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 in D:''Users''xxxxxx''send.php 在第 46 行

警告:SimpleXMLElement::__construct() [simplexmlelement.--construct]: ^ in D:''Users''xxxxxx''send.php 在第 46 行

致命错误:未捕获的异常"异常",消息"字符串可能" 在 D:''Users''xxxxxx''send.php:46 堆栈中不解析为 XML' trace: #0 D:''Users''xxxxxx''send.php(46): SimpleXMLElement->__construct('HTTP/1.1 200 OK...') #1 {main} throw 在 D:''xxxxxx''send.php 第 46 行

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

我认为问题仍然存在

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);

这是发送开机自检数据的正确方式