PHP XmlReader - 解析时读取错误

时间:2013-06-08 09:10:06

标签: php xml xmlreader

要阅读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文件。有人可能知道如何解决这个错误吗?

3 个答案:

答案 0 :(得分:2)

有许多不同的方法可以处理您遇到的错误情况。但首先,我认为您应该知道XMLReader基于libxmllibxml offers various functions,甚至基于LibXMLError object进行错误处理:

$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中使用名为 internal errors 的东西。

参见:

答案 1 :(得分:0)

我遇到了同样的问题。问题是您的XML无效。你不应该在XML中有特殊的字符(即&amp;应该在XML文件生成期间转换为&amp;)。

有关详细信息,您可以看到this类似的问题。

您基本上有两个选择:

  1. 您可以在解析之前修复文件(例如使用正则表达式)
  2. 您可以在第一时间修复生成XML的代码

答案 2 :(得分:-2)

使用XMLReader::isValid()

<?php $xml = XMLReader->open('file.xml');

// You have to use this:
$xml->setParserProperty(XMLReader::VALIDATE, true);

var_dump($xml->isValid());
?>