loadXML unhandleable error

时间:2011-05-07 19:08:49

标签: php xml

我正在使用PEAR XML_Feed_Parser。 我有一些bad xml我给它并得到错误。

DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE8 0xCF 0xD3 0xD4 in Entity, line: 7 

它实际上是错误编码的html - KOI8-R。

可以得到错误但我无法处理它!

当我用。创建新的XML_Feed_Parser实例时     $ feed = new XML_Feed_Parser($ xml);

它调用__construct(),看起来像那个

$this->model = new DOMDocument;
if (! $this->model->loadXML($feed)) {
    if (extension_loaded('tidy') && $tidy) {
        /* tidy stuff */
        }
    } else {
        throw new Exception('Invalid input: this is not valid XML');
}

我们可以看到如果loadXML()失败则抛出异常。

我想从loadXML()中捕获错误以跳过错误的XML并通知用户。所以我用try-catch包装我的代码

try
{
    $feed = new XML_Feed_Parser($xml);
    /* ... */
}
catch(Exception $e)
{
    echo 'Feed invalid: '.$e->getMessage();
    return False;
}

但即使在那之后我也收到了这个错误

DOMDocument::loadXML(): Input is not proper UTF-8, indicate encoding !
Bytes: 0xE8 0xCF 0xD3 0xD4 in Entity, line: 7 

我读过有关loadXML()并发现

  

如果将空字符串作为源传递,则会生成警告。此警告不是由libxml生成的,无法使用libxml的错误处理函数进行处理。

但不知怎的,而不是警告我得到错误,停止我的申请。我写了我的错误处理程序,我发现这确实是警告($ errno是2)。

所以我看到了2个解决方案:

  1. 将警告还原为警告 - 请勿 把它们视为错误。 (谷歌 在这里没有帮助我)。之后 handle从loadXML返回的False。

  2. 不知何故发现了这个错误。

  3. 任何帮助?

2 个答案:

答案 0 :(得分:3)

libxml_use_internal_errors(true)解决了我的问题。它使libxml使用正常错误,所以我可以从loadXML()中捕获False。

答案 1 :(得分:0)

试试这个:

$this->model = new DOMDocument;
$converted = mb_convert_encoding($feed, 'UTF-8', 'KOI8-R');
if (! $this->model->loadXML($converted)) {
if (extension_loaded('tidy') && $tidy) {
    /* tidy stuff */
    }
} else {
    throw new Exception('Invalid input: this is not valid XML');
}

或者您可以这样做而无需像这样修改XML_Feed_Parser:

$xml = mb_convert_encoding($loaded_xml, 'UTF-8', 'KOI8-R');
$feed = new XML_Feed_Parser($xml);