web-dev-qa-db-ja.com

PHP DOMDocumentエラー処理

私のアプリケーションでは、それを解析するためにurlからxmlをロードしています。ただし、このURLが無効な場合があります。この場合、エラーを処理する必要があります。私は次のコードを持っています:

$xdoc = new DOMDocument();
try{
  $xdoc->load($url); // This line causes Warning: DOMDocument::load(...)
                     // [domdocument.load]: failed to open stream: 
                     // HTTP request failed! HTTP/1.1 404 Not Found in ...
} catch (Exception $e) {
  $xdoc = null;
}

if($xdoc == null){
  // Handle
} else {
  // Proceed
}

私はおそらくそれを間違っていることを知っていますが、この種の例外を処理する正しい方法は何ですか?ページにエラーメッセージを表示したくありません。

DOMDocument :: load()のマニュアルには次のように書かれています。

空の文字列がファイル名として渡されるか、空のファイルに名前が付けられると、警告が生成されます。この警告はlibxmlによって生成されるものではなく、libxmlのエラー処理関数を使用して処理することはできません。

しかし、それを処理する方法についての情報はありません。

ありがとう。

21
Maksim Vi.

documentation から収集できることから、このメソッドによって発行された警告の処理は、libxml拡張によって生成されないため、libxml_get_last_error()では処理できないため注意が必要です。エラー抑制演算子を使用して、false ..の戻り値を確認することができます。

if (@$xdoc->load($url) === false)
    // ...handle it

...またはレジスタ エラー時に例外をスローするエラーハンドラ

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

そしてそれをキャッチします。

set_error_handler(function($number, $error){
    if (preg_match('/^DOMDocument::loadXML\(\): (.+)$/', $error, $m) === 1) {
        throw new Exception($m[1]);
    }
});

$xml = new DOMDocument();
$xml->loadXML($xmlData);

restore_error_handler();

これはPHP 5.3で機能します。ただし、loadXMLを使用していない場合は、いくつかの変更が必要になる場合があります。

7
Znarkus

エラーのスローを無効にするには:

$internal_errors = libxml_use_internal_errors(true);

$dom = new DOMDocument();
// etc...

libxml_use_internal_errors($internal_errors);
4
Petah

Php.netから

空の文字列がファイル名として渡されるか、空のファイルに名前が付けられると、警告が生成されます。この警告はlibxmlによって生成されるものではなく、libxmlのエラー処理関数を使用して処理することはできません。

実稼働環境では、ユーザーにエラーが表示されないようにする必要があります。彼らはそれらを見る必要がないので、これを考慮に入れて使用することができます...

$xdoc = new DOMDocument();
if ( $xdoc->load($url) ) {
    // valid
}
else {
    // invalid
}
2
Galen

私にとって、以下はトリックをしました

$feed = new DOMDocument();  
$res= @$feed->load('http://www.astrology.com/horoscopes/daily-extended.rss');
if($res==1){
           //do sth
          }
0
sumit