让PHP的XMLReader不会在无效文档中抛出php错误

Eve*_*ert 6 php xml xmlreader xml-parsing

我正在编写解析器,并尝试使用异常进行良好的错误处理.

以下示例代码:

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

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

$reader->read();
Run Code Online (Sandbox Code Playgroud)

发出:

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
Run Code Online (Sandbox Code Playgroud)

增加:

libxml_use_internal_errors(true);
Run Code Online (Sandbox Code Playgroud)

没有效果.

我的目标是稍后(使用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
Run Code Online (Sandbox Code Playgroud)

这表明底层的libxml库确实压制了错误,但是在XMLReader中,无论如何都会抛出错误.

laz*_*mer 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);
}
Run Code Online (Sandbox Code Playgroud)

因此,只有内部的实际解析错误xmlTextReaderRead()libxml_use_internal_errors(true);传递给 的 或 选项所抑制XMLReader::xml()

  • 非常不幸;我找到了相同的行并为其开了一张票:https://bugs.php.net/bug.php?id=64230 (3认同)