读取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中使用特殊字符(例如&应转换为&
有关更多信息,您可以看到类似的问题。
你基本上有两个选择:
- 您可以在解析之前修复文件(例如使用regex)
- 您可以首先修复生成XML的代码
使用XMLReader:: isValid()。
<?php $xml = XMLReader->open('file.xml');
// You have to use this:
$xml->setParserProperty(XMLReader::VALIDATE, true);
var_dump($xml->isValid());
?>