【发布时间】:2010-08-26 02:16:04
【问题描述】:
快速版:
捕获和处理 XMLReader 由于格式错误的文件引发的错误的标准(创新?任何?)方法是什么 - 特别是未转义的字符。拥有 Tidy(等)并不是一个超级吸引人的选项,有人知道一种方法可以简单地跳过有问题的节点并继续前进吗?
描述性版本:
我们都知道,如果格式不正确,它就不是 XML,但说实话——它确实发生了。客户端定期拉入需要读入 mysql 的大量 (50-100MB+) xml 文件。 XMLReader 是显而易见的选择,我们编写了一个非常适合我们需求的包装器。
有时,会发生错误并且 read() 无法终止导入 - drat!它几乎总是一个未转义的字符(例如“&”),它会把所有东西都绊倒。在大多数情况下,我们只是让客户致电数据提供者并要求他们修复有缺陷的文件。不幸的是,数据提供者并不总是有义务和/或及时。如果我们能简单地捕捉到错误并直接移动到下一个节点,那就太棒了。
我花了很长时间试图阅读/破解这个,但找不到任何值得细读的东西。我错过了一些明显的东西吗?
This SO question 看起来很有希望,但它只是没有产生任何结果。传递 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()) {
}
【问题讨论】:
标签: php error-handling xmlreader