PHP XmlReader -解析时读取错误


PHP XmlReader - Read error while parsing

读取XML文件使用:

$XMLFile = new XMLReader();
if($XMLFile->open('file.xml') === TRUE){                            
    while($XMLFile->read()) {
        //Do something
    }
    $XMLFile->close();
}

如果我在xml文件中找到示例字符串:

!+_)(*&^%$#@!~}|"?,../;''[]=-

显示严重错误并终止解析:

Warning: XMLReader::read() [xmlreader.read]: file.xml:16: parser error : xmlParseEntityRef: no name in test.php on line 841
Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in test.php on line 841

在这种情况下,我想处理错误并删除xml文件。有人知道如何修复这个错误吗?

处理这里的错误条件有许多不同的方法。但首先我认为你应该知道XMLReader是基于libxml的,libxml提供了各种功能,甚至LibXMLError对象用于错误处理:

$reader = new XMLReader();
if (!$reader->open($file)) {
    throw new RuntimeException('Unable to open file.');
}
while ($reader->read()) {
    //Do something
}
if (libxml_get_last_error()) {
    // There was an error reading the file
    unlink($file);
}

错误信息示例如下:

LibXMLError Object
(
    [level] => 3
    [code] => 68
    [column] => 12
    [message] => xmlParseEntityRef: no name
    [file] => /path/to/file.xml
    [line] => 2
)

对于这个示例XML文件:

<root>
    !+_)(*&^%$#@!~}|"?,../;''[]=-
</root>

如果你想减少错误输出,你可以使用libxml中的内部错误

参见:

    XMLReader编码错误

我也有同样的问题。问题是您的XML无效。您不应该在XML中使用特殊字符(例如&应转换为&

有关更多信息,您可以看到类似的问题。

你基本上有两个选择:

  1. 您可以在解析之前修复文件(例如使用regex)
  2. 您可以首先修复生成XML的代码

使用XMLReader:: isValid()。

<?php $xml = XMLReader->open('file.xml');
// You have to use this:
$xml->setParserProperty(XMLReader::VALIDATE, true);
var_dump($xml->isValid());
?>