SimpleXML_Load_File不会返回一个URL的结果,而是另一个URL的OK

时间:2016-08-04 11:01:31

标签: php xml simplexml

我有第三方服务我正在查询返回的XML文件。如果我在浏览器中访问该URL,我会看到XML数据,但SimpleXML_Load_File只是崩溃了,我也无法显示任何错误。 第一张DVD的URL可以正常工作并加载,但游戏却没有。

任何人都可以在这里看到我的代码有什么问题,或者返​​回XML以指示为什么simplexml_load_file会失败并阻止页面执行中的更多php?

<?php
######DVDs
$dvdURL = 'http://dvd.find-services.co.uk/dvdSearch.aspx?sort=popular&site=sample&pagesize=1';

$dvdfeed = simplexml_load_file($dvdURL);
var_dump($dvdfeed);
echo '<hr>';
###########Games
$gameURL = 'http://game.find-services.co.uk/gameSearch.aspx?order=popular&site=sample&pagesize=1';

$gamefeed = simplexml_load_file($gameURL);
var_dump($gamefeed);
?>

好的,在Grim的评论之后......关于PHPfiddle的代码,我在我的服务器上只使用了下面的代码:

<?php
$gameURL = 'http://game.find-services.co.uk/gameSearch.aspx?order=popular&site=sample&pagesize=1';
$gamefeed = simplexml_load_file($gameURL);
var_dump($gamefeed);
?>

给出错误!

  

内部服务器错误   服务器遇到内部错误或配置错误,无法完成您的请求。   请通过webmaster@finditcheapest.com与服务器管理员联系,告知他们此错误发生的时间以及您在此错误发生之前执行的操作。   服务器错误日志中可能提供了有关此错误的更多信息。   此外,尝试使用ErrorDocument处理请求时遇到500内部服务器错误错误。

但是,访问我的cPanel中的错误日志不会显示任何条目。有什么想法吗?

@Grim ...建议使用cURL,所以这是新代码:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://game.find-services.co.uk/gameSearch.aspx?order=popular&site=sample&pagesize=1");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec($ch);
$xml = utf8_encode($xml);
var_dump($xml);
$simpleXml = simplexml_load_string($xml);
var_dump($simpleXml);
curl_close($ch);
?>

第二个var_dump仍为空白,第一个给出:

  

string(541)&#34; B00ZG1S834ps4PlayStation 446927No Mans Sky11148490&#34;

视图来源显示:

string(541) "<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?><games><game><id>B00ZG1S834</id><platform>ps4</platform><platformName>PlayStation 4</platformName><category><![CDATA[Strategy]]></category><title><![CDATA[No Man's Sky (PS4)]]></title><titleRefNo>46927</titleRefNo><groupTitle>No Mans Sky</groupTitle></game><ResultsInfo><Message></Message><SearchString></SearchString><SearchPlatform></SearchPlatform><Page>1</Page><PageSize>1</PageSize><MoreResultsAvailable>1</MoreResultsAvailable><RowCount>48490</RowCount></ResultsInfo></games>"

2 个答案:

答案 0 :(得分:2)

后一个URL(game.find-services ...)使用ISO-8859-1编码,但PHP需要UTF-8。最好使用CURL加载文件,使用utf8_encode将其转换为UTF-8,然后使用simplexml_load_string获取您的数据。

答案 1 :(得分:1)

几个月后,事实证明这很简单。从原始代码,我改变了行:

$dvdfeed = simplexml_load_file($dvdURL);

为:

$dvds= GetPage($dvdfeed );
$dvdfeed = @simplexml_load_string($dvds);

其中GetPage()是PHP函数,如下所示:

function GetPage ($URL, $PostParams = ''){
// Set params...
$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 100);
if ($PostParams <> ''){
    curl_setopt($ch, CURLOPT_POSTFIELDS, $PostParams);
};
$Page = curl_exec($ch);
curl_close($ch);
return $Page;
};

现在无论编码如何,都可以正确加载和解析XML。