快速版本:
什么是标准(创新?任何?)捕获和处理 XMLReader 由于格式错误的文件引发的错误的方法 - 特别是未转义的字符。拥有 Tidy(等)并不是一个超级吸引人的选项,有人知道一种简单地跳过有问题的节点并继续前进的方法吗?
描述性版本:
我们都知道,如果格式不正确,它就不是 XML,但说实话——它确实发生了。客户端定期拉入需要读入 mysql 的大量 (50-100MB+) xml 文件。XMLReader 是显而易见的选择,我们编写了一个非常适合我们需要的包装器。
有时,会发生错误并且 read() 无法终止导入 - drat!它几乎总是一个未转义的字符(例如“&”),它会把所有东西都绊倒。在大多数情况下,我们只是让客户致电数据提供者并要求他们修复有缺陷的文件。不幸的是,数据提供者并不总是有义务和/或及时。如果我们能简单地捕捉到错误并直接移动到下一个节点,那就太棒了。
我花了很长时间试图阅读/破解这个,但找不到任何值得细读的东西。我错过了一些明显的东西吗?
这个 SO 问题似乎很有希望,但它只是没有产生任何结果。通过 1 似乎应该要求 Reader 恢复,但我们只是没有看到任何尝试/不同的错误消息等。以下是概述该方法的相关代码:
$xml->open($file, null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
我总是可以用 Tidy 进行预处理,但一定有更好的方法。
我考虑了一些更“创造性”的方法,例如在当前节点的逻辑完成后用 try/catch 嗅探下一个 Read(),但这似乎很笨拙。使用自定义/包装函数模拟 Read() 似乎也有潜力,该函数有助于在节点之间移动并结合错误处理,但我觉得我过于简单化了。
所以总结一下:当 read() 失败时,我怎样才能捕捉到错误并继续前进?我们是否有机会看到即将发生的错误(至少是 XMLReader 会抛出的消息)?
$xml = new XMLReader();
$xml->open($file);
while ($xml->read()) {
}