Php 捕获DOMDocument上的404错误->;加载()
我正在使用DOM加载一堆rss提要,有时会使用404而不是生成文件。问题是web服务器发送一个html 404页面来代替预期的xml文件,因此使用以下代码: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
$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!!
}