1

我使用 cURL 将一些 XML 从一个页面发布到同一站点上的另一个页面:

我从一个数组生成 XML(这个位工作正常):

$xml = new SimpleXMLElement('<test/>');
array_walk_recursive($arr, array ($xml, 'addChild'));
$xmlxml = $xml->asXML()

然后使用 cURL 发布到另一个页面:

$url = "http://www.test.com/feedtest.php";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlxml);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

这会产生错误:

警告:simplexml_load_file() [function.simplexml-load-file]:I/O 警告:无法在“xxxxx/”中加载外部实体“<?xml version="1.0"?> <test> [....]”第 16 行上的 feedtest.php"

我究竟做错了什么?

我应该补充一下,这是另一页上发生的事情:

if ( $_SERVER['REQUEST_METHOD'] === 'POST' ){ 
    $postFile = file_get_contents('php://input'); 
}
$xml = simplexml_load_file($postFile);

最后一行是触发错误的行。

4

1 回答 1

1

这是一个非常微不足道的错误,很容易错过:

$postFile = file_get_contents('php://input'); 
            ^^^^^^^^^^^^^^^^^

这已将 XML 字符串放入其中$postFile。但是然后您将其用作文件名:

$xml = simplexml_load_file($postFile);
                      ^^^^

相反,您可以这样加载它:

$postFile = 'php://input';

这是一个完美的有效文件名。所以后面的代码应该可以工作:

$xml = simplexml_load_file($postFile);

或者,您可以加载字符串:

$postFile = file_get_contents('php://input'); 
...
$xml = simplexml_load_string($postFile);
于 2012-12-21T01:21:16.353 回答