【问题标题】:PHP - Read and repair big invalid XML filesPHP - 读取和修复大的无效 XML 文件
【发布时间】:2013-03-18 17:30:33
【问题描述】:

我必须阅读一些非常重的 XML 文件(在 200 MB 和 1 GB 之间),其中一些文件是无效的。让我举个小例子:

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:g="http://base.google.com/ns/1.0" version="2.0">
  <item>
    <title>Some article</title>
    <g:material><ul><li>50 % Coton</li><li>50% Lyocell</li></g:material>
  </item>
</rss>

显然,g:material 标记中缺少 &lt;/ul&gt; 结束标记。此外,开发此提要的人应该将g:material 内容包含在CDATA 中,但他们没有...基本上,这就是我想要做的:添加这个缺少的CDATA 部分。

我尝试使用 SAX 解析器读取此文件,但在读取 &lt;/g:material&gt; 标记时失败,因为缺少 &lt;/ul&gt; 标记。我尝试过使用 XMLReader,但遇到了基本相同的问题。 我可能可以用 DomDocument::loadHtml 做一些事情,但是这个文件的大小与 DOM 方法并不真正兼容。 您知道我如何可以简单地修复此提要,而无需购买大量 RAM 以供 DomDocument 工作吗? 谢谢。

【问题讨论】:

  • 是的,他们应该这样做。如果您知道问题出在哪里,您可以随时尝试使用正则表达式查找/替换所有文件。但这不应该是你首先关心的问题。
  • 嘿,Rémi,你不能先读取字符串,然后添加 CDATA 部分,然后再将其推送到 xml 加载器?
  • 是的,这就是我正在考虑的以及我现在正在做的事情,但我仍然希望有比逐个字符读取 XML 或使用正则表达式查找/替换更好的想法:)跨度>
  • 查看类似(最早的)问题:stackoverflow.com/q/2939250/287948

标签: php xml sax


【解决方案1】:

(复制自https://stackoverflow.com/a/17903058/287948

总结为两步:

  1. 使用 Tidy 将“免费的 HTML”转换为“好的 XHTML”。
  2. 使用 XML Parser 通过 SAX API 将 XHTML 解析为 XML。

首先使用Tidy (!),将“免费 HTML”转换为 XHTML(或者当您无法信任“假定的 XHTML”时)。请参阅cleanRepair 方法。它需要更多时间,但运行大文件(!)...Set some minutes as maximum execution time 如果太大。

另一个选项(用于处理大文件)是在检查或转换为 XHTML 后缓存您的 XHTML 文件。请参阅 Tidy 的 repairfile 方法。

使用“受信任的 XHTML”,使用 SAX...如何将 SAX 与 PHP 一起使用?

SAX standard API解析XML,在PHP中由LibXML实现(参见LibXML2xmlsoft.org),它的接口是PHP's XML Parser,它靠近SAX 标准 API

使用“LibXML2 的 SAX”的另一种方法是使用 XMLReader 和另一个接口(@98​​7654330@ 而不是传统的 SAX 接口)。见this explanation about "XMLReader use SAX"


是的,术语“SAX”或“SAX API”未在 PHP 手册中表达 (!)。见this old but good introduction

【讨论】:

    【解决方案2】:

    如果文件太大而无法使用Tidy 扩展名,您可以使用tidy CLI tool 使文件可解析。

    $ tidy -output my.clean.xml my.xml
    

    之后,XML 文件格式正确,因此您可以使用 XMLReader 解析它们。由于 tidy 添加了“缺少的”(X)HTML 部分,因此您的原始文档的代码位于元素内。

    【讨论】:

    • ops,你可以对大文件使用 Tidy 扩展(见下面我的回答)。您可以使用 PHP 作为命令,通过终端将 HTML 文件转换为 XHTML。
    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    相关资源
    最近更新 更多