【问题标题】:XMLReader (in Php) and Error HandlingXMLReader(在 PHP 中)和错误处理
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      http://php.net/manual/en/function.libxml-use-internal-errors.php 当此设置为默认 false 值时,将在任何无效 XML 上触发 PHP 警告。 换句话说,您应该已经看到了:p 您只是没有注意,或者有一个有效的设置或自定义错误处理程序对您隐藏 PHP 警告。

      如果调用上面的函数为true,则不会产生警告,而是会在该函数返回的内部数组中累积错误:

      http://www.php.net/manual/en/function.libxml-get-errors.php

      关于“前进”部分,恐怕 cweiske 是对的,但无法做到。您可以使用某些工具预先筛选 XML 中的错误(甚至使用 XMLReader 解析它们)并尝试更正您发现的错误,即删除/替换无效字符,但是您需要重新开始解析更正的数据。

      【讨论】:

        【解决方案3】:

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

        这个HTML to XML filter 就是这样做的。把它当作

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多