我必须阅读一些非常繁重的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购买大量内存来运行?
感谢。
答案 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复制)
总结为两个步骤:
首先使用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"。