6

私はパーサーを書いている最中で、例外を使って適切なエラー処理をしようとしています。

次のサンプル コード:

<?php
$xml = <<<XML
<?xml version="1.0"?>
<rootElem>
XML;

$reader = new XMLReader();
$reader->xml($xml, null, LIBXML_NOERROR | LIBXML_NOWARNING);

$reader->read();

放出するもの:

PHP Warning:  XMLReader::read(): An Error Occured while reading in /Users/evert/code/xml/errortest.php on line 11
PHP Stack trace:
PHP   1. {main}() /Users/evert/code/xml/errortest.php:0
PHP   2. XMLReader->read() /Users/evert/code/xml/errortest.php:11

以下の追加:

libxml_use_internal_errors(true);

効果はありません。

私の目標は、エラーを後で ( でlibxml_get_errors()) チェックし、例外をスローすることです。唯一の解決策は Silence ( @) 演算子を使用することだと思いますが、これは悪い考えのようです..

LIBXML定数を渡さない場合や を使用しない場合libxml_use_internal_errors、次のような別のエラーが発生することに注意してください。

PHP Warning:  XMLReader::read(): /Users/evert/code/xml/:2: parser error : Extra content at the end of the document in /Users/evert/code/xml/errortest.php on line 11

これは、基礎となる libxml ライブラリーが実際にエラーを抑制していることを示唆していますが、XMLReader 内ではとにかくエラーがスローされます。

4

2 に答える 2

4

@PHPソースにread()は次の行があるため、を使用する以外に警告を抑制する方法はないようです。

retval = xmlTextReaderRead(intern->ptr);
if (retval == -1) {
    php_error_docref(NULL TSRMLS_CC, E_WARNING, "An Error Occured while reading");
    RETURN_FALSE;
} else {
    RETURN_BOOL(retval);
}

そのため、内部の実際の解析エラーのみがまたは に渡されたオプションxmlTextReaderRead()によって抑制されます。libxml_use_internal_errors(true);XMLReader::xml()

于 2013-02-18T01:02:38.700 に答える