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

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>

显然,g:material标签中缺少闭合标签</ul>。此外,开发这个Feed的人应该将g:material内容封装到CDATA中,但他们没有...基本上,我想做的就是添加丢失的CDATA部分。
我尝试使用SAX解析器读取此文件,但在读取</g:material>标签时失败,因为缺少</ul>标签。我尝试了XMLReader,但基本上遇到了相同的问题。 我可能可以使用DomDocument :: loadHtml来处理,但是这个文件的大小与DOM方法不太兼容。 您有什么想法,如何能简单地修复此Feed,而不必购买大量RAM让DomDocument正常工作? 谢谢。

是的,他们本应该这样做。如果您知道问题出在哪里,您可以尝试使用正则表达式查找/替换所有文件。但这本不应该是您首要关注的问题。 - mpm
嘿,Rémi,你能不能在将字符串推送到xml加载器之前阅读它并添加CDATA部分? - brisssou
是的,这正是我所思考的,也是我现在正在做的事情,但我仍然希望有更好的方法来处理XML,而不是逐个字符地读取或使用正则表达式进行查找/替换 :) - Remi
请参考类似的(最古老的)问题:https://dev59.com/107Sa4cB1Zd3GeqP0x1v - Peter Krauss
2个回答

3
如果文件过大无法使用Tidy扩展,您可以使用tidy CLI工具使文件可解析。
$ tidy -output my.clean.xml my.xml

之后,XML文件是格式良好的,因此您可以使用XMLReader解析它们。由于tidy添加了“缺失”的(X)HTML部分,因此您原始文档的代码在<body>元素内。


操作,你可以使用Tidy扩展处理大文件(请参见下面的答案)。并且你可以在终端中使用PHP作为命令将HTML文件转换为XHTML。 - Peter Krauss

0

(从https://dev59.com/107Sa4cB1Zd3GeqP0x1v#17903058中复制)

总结为两个步骤:

  1. 使用Tidy将“自由的HTML”转换为“良好的XHTML”。
  2. 使用XML解析器通过SAX API解析XHTML作为XML。

首先使用Tidy(!)将“自由HTML”转换为XHTML(或者当您不能信任您的“所谓XHTML”时)。请参见cleanRepair方法。它需要更多时间,但可以处理大文件(!)...如果太大,请设置几分钟作为最大执行时间

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

对于“可信XHTML”,使用SAX...如何在PHP中使用SAX?

使用SAX标准API解析XML,在PHP中可以通过LibXML实现(请参见xmlsoft.orgLibXML2),其接口是PHP的XML解析器,接近于SAX标准API

另一种使用"SAX of LibXML2"的方法,使用另一个接口(PHP迭代器而不是传统的SAX接口),是使用XMLReader。请参见关于"XMLReader使用SAX"的说明


是的,PHP手册中没有提到"SAX"或"SAX API"这些术语。请参见这篇旧但很好的介绍


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接