在DOMDocument-> load()上捕获404错误

时间:2012-05-01 09:24:30

标签: php xml dom rss

我正在使用DOM加载一堆rss feed,有时会有404而不是生成文件。问题是web服务器发出一个html 404页面来代替预期的xml文件,所以使用这个代码:

$rssDom = new DOMDocument();
$rssDom->load($url);
$channel = $rssDom->getElementsByTagName('channel');
$channel = $channel->item(0);
$items = $channel->getElementsByTagName('item');

我收到了这个警告:

Warning: DOMDocument::load() [domdocument.load]: Entity 'nbsp' not defined

后面跟着这个错误:

Fatal error: Call to a member function getElementsByTagName() on a non-object

通常,这段代码工作正常,但是在我得到404的情况下,它无法做任何事情。我在load语句周围尝试了一个标准的try-catch,但它似乎没有抓住它。

5 个答案:

答案 0 :(得分:5)

您可以{/ 3}}

libxml_use_internal_errors(true);

要检查返回的回复是否为404,您可以在致电DOMDocument::load()后查看suppress the output of parsing errors

示例:

libxml_use_internal_errors(true);
$rssDom = new DOMDocument();
$rssDom->load($url);
if (strpos($http_response_header[0], '404')) {
    die('file not found. exiting.');
}

替代方法是使用file_get_contents,然后检查响应标头,如果不是404,则使用DOMDocument::loadXml加载标记。这会阻止DOMDocument解析无效的XML。

请注意,所有这些都假定服务器在响应中正确返回404标头。

答案 1 :(得分:2)

使用file_get_contentscurl手动加载HTML(允许您进行自己的错误检查),如果一切顺利,则将结果提供给DOMDocument::loadHTML

这里有很多curl个例子(例如,看this one,虽然它肯定不是最好的);要获取HTTP状态代码,请使用curl_getinfo

答案 2 :(得分:0)

为了避免警告,你可以使用LIBXML_NOWARNING(注意:抑制警告通常不是一件好事)。

这里更重要的问题是致命错误:要避免这种情况,您应该检查文档是否已正确加载。为此,只需保存load()s return-value即可:

$loaded = $rssDom->load($url, LIBXML_NOWARNING);
if($loaded){
    $channel = $rssDom->getElementsByTagName('channel');
    $channel = $channel->item(0);
    $items = $channel->getElementsByTagName('item');
}else{
    // show error-message or something like that
}

答案 3 :(得分:0)

像这样:

$rssDom = new DOMDocument();
if($rssDom->load($url)) {
   $channel = $rssDom->getElementsByTagName('channel');
   $channel = $channel->item(0);
   $items = $channel->getElementsByTagName('item');
}

答案 4 :(得分:0)

如果有人需要解决方案,这就像魅力一样:

$objDOM = new DOMDocument();
$loaded=@$objDOM->load(url);

if (!$loaded){
    //something went terribly wrong
} else {
    //this is going ok!!
}

这可以通过'@'来抑制警告,并且在出现错误时加载返回true或false。