[英]Catch 404 error on DOMDocument->load()
我正在使用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,但它似乎没有抓住它。
您可以使用抑制解析错误的输出
libxml_use_internal_errors(true);
要检查返回的响应是否为404,您可以在调用DOMDocument::load()
之后检查$http_response_header
例:
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标头。
使用file_get_contents
或curl
手动加载HTML(允许您进行自己的错误检查),如果一切顺利,则将结果提供给DOMDocument::loadHTML
。
这里有很多curl
例子(例如看这个 ,虽然它肯定不是最好的); 要获取HTTP状态代码,您将使用curl_getinfo
。
为了避免警告,你可以使用LIBXML_NOWARNING
(注意:抑制警告通常不是一件好事)。
这里更重要的问题是致命错误:要避免这种情况,您应该检查文档是否已正确加载。 为此,只需保存load()
的返回值即可 :
$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
}
像这样:
$rssDom = new DOMDocument();
if($rssDom->load($url)) {
$channel = $rssDom->getElementsByTagName('channel');
$channel = $channel->item(0);
$items = $channel->getElementsByTagName('item');
}
如果有人需要解决方案,这就像魅力:
$objDOM = new DOMDocument();
$loaded=@$objDOM->load(url);
if (!$loaded){
//something went terribly wrong
} else {
//this is going ok!!
}
这有效,因为我们通过'@'来抑制警告,并且在出现错误时,load返回true或false。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.