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

fis*_*en0 4 php xml rss dom

我正在使用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');
Run Code Online (Sandbox Code Playgroud)

我收到这个警告:

Warning: DOMDocument::load() [domdocument.load]: Entity 'nbsp' not defined
Run Code Online (Sandbox Code Playgroud)

接下来是这个错误:

Fatal error: Call to a member function getElementsByTagName() on a non-object
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*don 5

您可以抑制解析错误的输出与

libxml_use_internal_errors(true);
Run Code Online (Sandbox Code Playgroud)

要检查返回的响应是否为404,您可以$http_response_header在调用后检查DOMDocument::load()

例:

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

另一种方法是使用file_get_contents然后检查响应头,如果它不是404加载标记DOMDocument::loadXml.这样可以防止DOMDocument解析无效的XML.

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