4

DOMを使用して大量のRSSフィードをロードしていますが、ファイルを生成する代わりに404フィードを実行する場合があります。問題は、Webサーバーが予期されたxmlファイルの代わりにhtml 404ページを送信するため、次のコードを使用することです。

$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を試しましたが、キャッチされていないようです。

4

5 に答える 5

8

解析エラーの出力を抑制することができます

libxml_use_internal_errors(true);

返された応答が404であるかどうかを確認するには$http_response_headerDOMDocument::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_get_contents別の方法は、応答ヘッダーを使用して確認し、それが404でない場合は、マークアップに。をロードすることDOMDocument::loadXmlです。DOMDocumentこれにより、無効なXMLの解析が防止されます。

これはすべて、サーバーが応答で404ヘッダーを正しく返すことを前提としていることに注意してください。

于 2012-05-01T09:33:37.840 に答える
2

file_get_contentsまたはを使用してHTMLを手動でロードしcurl(これにより、独自のエラーチェックを実行できます)、すべてがうまくいった場合は、結果をにフィードしますDOMDocument::loadHTML

ここにはたくさんのcurl例があります(たとえば、これは確かに最良ではありませんが、これを見てください)使用するHTTPステータスコードを取得するにはcurl_getinfo

于 2012-05-01T09:30:24.790 に答える
0

警告を回避するには、を使用できますLIBXML_NOWARNING(注:通常、警告を抑制することは適切ではありません)。

ここでのより重要な問題は致命的なエラーです。これを回避するには、ドキュメントが正しくロードされているかどうかを確認する必要があります。load()これに、 sの戻り値を保存して次のようにします。

$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
}
于 2012-05-01T09:33:58.643 に答える
0

このような:

$rssDom = new DOMDocument();
if($rssDom->load($url)) {
   $channel = $rssDom->getElementsByTagName('channel');
   $channel = $channel->item(0);
   $items = $channel->getElementsByTagName('item');
}
于 2012-05-01T09:36:12.620 に答える
0

誰かが解決策を必要とする場合、これは魅力のように機能します:

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

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

これは、「@」による警告を抑制し、エラーが発生した場合にloadがtrueまたはfalseを返すために機能します。

于 2013-01-24T10:02:33.863 に答える