6

我必须阅读一些非常重的 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标签。此外,开发此提要的人应该将g:material内容包含在CDATA中,但他们没有...基本上,这就是我想要做的:添加这个缺失的CDATA部分。

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

4

2 回答 2

3

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

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

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

于 2013-03-28T14:47:10.453 回答
0

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

总结为两步:

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

使用第一个Tidy (!),将“免费 HTML”转换为 XHTML(或者当您无法信任“假定的 XHTML”时)。请参阅cleanRepair方法。它需要更多时间,但运行大文件(!)...如果太大 ,请将几分钟设置为最大执行时间。

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

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

使用SAX 标准 API解析 XML ,在 PHP 中由LibXML实现(参见xmlsoft.org上的LibXML2),其接口是PHP 的 XML Parser,它接近SAX 标准 API

另一种使用“SAX of LibXML2 ”和另一个接口(一个PHP 迭代器而不是传统的 SAX 接口)的方法是使用XMLReader。请参阅有关“XMLReader 使用 SAX”的说明


是的,PHP 手册 (!) 中没有表达术语“SAX”或“SAX API”。看到 这个古老但很好的介绍

于 2013-07-27T22:36:04.823 回答