PHP - 读取和修复大的无效XML文件

时间:2013-03-28 10:13:06

标签: php xml sax

我必须阅读一些非常繁重的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>

显然,</ul>标记中缺少g:material结束标记。此外,已开发此Feed的人应将g:material内容附加到CDATA,但他们没有...基本上,这就是我想要做的事情:添加此缺少的CDATA部分。

我尝试使用SAX解析器来读取此文件,但在读取</g:material>标记时失败,因为缺少</ul>标记。我尝试过使用XMLReader,但基本上遇到了同样的问题。 我可以用DomDocument :: loadHtml做一些事情,但是这个文件的大小与DOM方法并不真正兼容。 您是否知道我如何才能简单地修复此Feed而无需为DomDocument购买大量内存来运行? 感谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

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

总结为两个步骤:

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

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

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

    使用“受信任的XHTML”,使用SAX ...如何在PHP中使用SAX?

    使用SAX standard API解析XML,在PHP中由LibXML实现(参见 LibXML2 xmlsoft.org),其接口为{{3 },接近 SAX标准API

    另一种使用“ LibXML2 的SAX”的方法是使用另一个接口(一个PHP's XML Parser而不是传统的SAX接口),使用PHP iterator。请参阅XMLReader


    是的,PHP手册(!)中没有表达“SAX”或“SAX API”这两个术语。请参阅this explanation about "XMLReader use SAX"