XMLReader(在Php中)和错误处理

XMLReader(在Php中)和错误处理,php,error-handling,xmlreader,Php,Error Handling,Xmlreader,快速版本: 捕获和处理XMLReader由于文件格式错误(特别是未转义字符)而抛出的错误的标准(创新的?任何?)方法是什么。使用Tidy(等等)进行预评价并不是一个非常吸引人的选择,有人知道一种简单地跳过有问题的节点并直接向前移动的方法吗 描述性版本: 我们都知道,如果格式不正确,它就不是XML,但老实说,它确实存在。一个客户端定期拉入大量(50-100MB+)xml文件,这些文件需要读入mysql。XMLReader显然是首选,我们已经编写了一个包装器,它可以很好地满足我们的需要 有时会发生错

快速版本:

捕获和处理XMLReader由于文件格式错误(特别是未转义字符)而抛出的错误的标准(创新的?任何?)方法是什么。使用Tidy(等等)进行预评价并不是一个非常吸引人的选择,有人知道一种简单地跳过有问题的节点并直接向前移动的方法吗

描述性版本:

我们都知道,如果格式不正确,它就不是XML,但老实说,它确实存在。一个客户端定期拉入大量(50-100MB+)xml文件,这些文件需要读入mysql。XMLReader显然是首选,我们已经编写了一个包装器,它可以很好地满足我们的需要

有时会发生错误,read()无法终止import-drat!它几乎总是一个未转义字符(ex“&”),它会使所有内容都出错。在大多数情况下,我们只是让客户机呼叫数据提供商,要求他们修复有缺陷的文件。不幸的是,数据提供者并不总是乐于助人和/或及时。如果我们能够简单地捕捉到错误并直接移动到下一个节点,那将是令人惊讶的

我花了很长时间试图阅读/破解这本书,但找不到任何值得一读的东西。我错过了什么明显的东西吗

看起来很有希望,但却没有任何结果。传递1似乎应该要求读卡器恢复,但我们只是没有看到任何尝试/不同的错误消息,等等。。以下是概述该方法的相关代码:

$xml->open($file, null, LIBXML_NOERROR | LIBXML_NOWARNING | 1);
我可以用Tidy进行预处理,但一定有更好的方法

我考虑过一些更“有创意”的方法,比如在当前节点的逻辑完成后,用try/catch嗅探下一个Read(),但这充其量看起来很笨拙。似乎还可以使用一个自定义/包装器函数来模拟Read(),该函数有助于在节点间移动并合并错误处理,但我觉得我过于简单化了

总之,当read()失败时,我如何抓住错误并继续前进?我们是否有可能看到即将发生的错误(至少是XMLReader可能抛出的消息)


它是一个XML读取器,是为读取XML而设计的。无效XML不是XML,不能用XML读取器读取—就这么简单

在导入文件之前,对文件运行
xmllint
,查看其是否有效,或者执行正确的操作并告诉数据提供商生成有效的xml。

关于问题的“查看错误”部分:

当此设置为默认的false值时,将在任何无效XML上触发PHP警告。 换句话说,您应该看到它:p您只是没有注意到,或者有一个设置或自定义错误处理程序对您隐藏PHP警告

如果使用true调用上述函数,则不会生成警告,相反,此函数返回的内部数组中将累积错误:


关于“继续前进”的部分,恐怕cweiske是对的,不能这样做。您可以使用某种工具预先筛选XML中的错误(甚至使用XMLReader对其进行解析),并尝试更正发现的错误,即删除/替换无效字符,但随后需要重新对更正的数据进行解析。

我遇到了同样的问题。使用,您可以在将XML提供给XMLReader之前修复它

这就是这个。把它当作

$dsn = "php://filter/read=htmltoxml.entities/resource=" . $url;
$xml = XMLReader::open($dsn);
$dsn = "php://filter/read=htmltoxml.entities/resource=" . $url;
$xml = XMLReader::open($dsn);