【问题标题】:Read XML file while its being writen into it PHP在写入 XML 文件时读取它 PHP
【发布时间】:2013-03-11 19:27:21
【问题描述】:

有没有办法在文件损坏的情况下读取 XML 文件?

我正在尝试获取一个 XML 文件,同时将文件写入其中并输出它,但我遇到了一个损坏的错误,因为根元素未关闭,因为它正在写入中间。

有没有办法做到这一点?

【问题讨论】:

  • 我们能问一下您为什么要实现这一目标吗?等待文件写入完成然后抓取有什么问题?
  • 因为文件很大,需要一段时间才能完成,所以我想在完成之前输出内容。
  • 是否需要 xmlreader,还是DOMDocument 可以?
  • 你用什么来写入文件?为什么不使用 DOMDocument - 添加节点至少可以确保您在读取文件时它是有效的 xml...
  • @Wrikken xmlreader 不是必需的,但更好。

标签: php xml xmlreader xmlwriter


【解决方案1】:
$broken ='<root>
     <item>foo</item>';

$d  = new DOMDocument();
$d->loadXML($broken);
echo $d->saveXML($d); // useless, only prologue
$d->recover = true; // <--  it's limited, but will try its best.
$d->loadXML($broken);
echo $d->saveXML($d);
/*
 * <?xml version="1.0" encoding="UTF-8"?>
 * <root>
 * <item>foo</item></root>
 */

【讨论】:

  • 我必须先保存固定的 XML 文件?
  • 如果您愿意...我只使用-&gt;saveXML() 作为一种方法来显示它是否已尽可能多地恢复了 XML。致电-&gt;loadXML() 后,您可以使用DOMDocument 为所欲为。
  • 谢谢,页面顶部的错误可以去掉吗?
  • 可以在加载之前设置libxml_use_internal_errors(true);但我不推荐它。我认为这不是经常发生的情况,并且与以往一样,在生产中,您将 display_errors 设置为 false,并将 log_errors 设置为打开,因此您至少会收到通知/记录您的 XML 实际上已损坏。
  • 我认为无论哪种方式我都必须这样做,谢谢它太棒了。
【解决方案2】:

要么使用文件锁定,要么让你的写入原子化,这样其他进程就看不到半写的文件。有关这两种方法的代码,请参见 this answer 的中间部分。

您还可以通过为您处理并发并为您提供一致的读取和写入的东西(即数据库)来调解您的写入。它不必是一个成熟的独立进程——您可以使用 sqlite 或简单的key-value store

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    相关资源
    最近更新 更多