Php 捕获DOMDocument上的404错误->;加载()

Php 捕获DOMDocument上的404错误->;加载(),php,xml,dom,rss,Php,Xml,Dom,Rss,我正在使用DOM加载一堆rss提要,有时会使用404而不是生成文件。问题是web服务器发送一个html 404页面来代替预期的xml文件,因此使用以下代码: $rssDom = new DOMDocument(); $rssDom->load($url); $channel = $rssDom->getElementsByTagName('channel'); $channel = $channel->item(0); $items = $channel->getElem

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

$rssDom = new DOMDocument();
$rssDom->load($url);
$channel = $rssDom->getElementsByTagName('channel');
$channel = $channel->item(0);
$items = $channel->getElementsByTagName('item');
我得到这个警告:

警告:DOMDocument::load()[DOMDocument.load]:未定义实体“nbsp”
然后是此错误:

致命错误:对非对象调用成员函数getElementsByTagName()

通常,这段代码工作得很好,但在我得到404的情况下,它什么都做不了。我在load语句周围尝试了一个标准的try-catch,但它似乎没有捕获它。

使用
file\u get\u contents
curl
(这允许您自己进行错误检查)手动加载HTML,如果一切顺利,则将结果提供给

这里有很多
curl
示例(例如,请看,尽管它肯定不是最好的);要获取HTTP状态代码,请使用。

您可以使用

要检查返回的响应是否为404,可以在调用
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.');
}
另一种方法是使用
file\u get\u contents
,然后检查响应头,如果不是404,则使用
DOMDocument::loadXml
加载标记。这将防止
DOMDocument
解析无效的XML


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

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

这里更重要的问题是致命错误:为了避免这种情况,您应该检查文档是否已正确加载。为此,只需保存并启用:

$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。

如果“实体nbsp;未定义”,404是否会返回XML(非HTML)源?(
没有在XML中定义。)+1,尽管我想我更喜欢它,因为我根本不知道
$http\u response\u headers
。PHP,你能降到多低?@Jon是的,我更喜欢像
get\u last\u response\u headers()
这样的函数,而不是
$http\u response\u headers
在http调用后神奇地填充。太不明显了,打字错误<代码>$http\u response\u header未定义,而
$http\u response\u header
已定义。文档页面也链接到了单数
标题
。问题是load认为它成功了,所以它不会保持为false。正如我前面所说,问题是load认为它成功了,所以它不会保持为false。我曾经检查HTTP状态代码。
$objDOM = new DOMDocument();
$loaded=@$objDOM->load(url);

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