Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-读取和修复大型无效XML文件_Php_Xml_Sax - Fatal编程技术网

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

PHP-读取和修复大型无效XML文件,php,xml,sax,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><

我必须读取一些相当繁重的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>

一些文章
  • 50%Coton
  • 50%Lyocell
显然,在
g:material
标签中缺少
结束标签。此外,开发此提要的人应该将
g:material
内容包含在
CDATA
中,而他们没有。。。基本上,这就是我想要做的:添加这个缺少的
CDATA
部分

我尝试使用SAX解析器读取此文件,但在读取
标记时失败,因为
标记丢失。我尝试过XMLReader,但基本上遇到了相同的问题。 我可能可以使用DomDocument::loadHtml做一些事情,但是这个文件的大小与DOM方法并不完全兼容。 你知道我如何简单地修复这个提要,而不必为DomDocument的工作购买大量RAM吗?
谢谢。

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

$ tidy -output my.clean.xml my.xml
之后,XML文件格式良好,因此可以使用XMLReader解析它们。由于tidy添加了“缺少的”(X)HTML部分,因此原始文档的代码位于元素中。

(从中复制)

概括为两个步骤:

  • 使用Tidy将“免费HTML”转换为“良好的XHTML”
  • 使用XML解析器通过SAXAPI将XHTML解析为XML

  • 使用first(!)将“免费HTML”转换为XHTML(或者当您不能信任“假定的XHTML”时)。见方法。它需要更多的时间,但运行大文件(!)。。。如果太大的话

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

    使用“可信的XHTML”,使用SAX。。。如何在PHP中使用SAX

    使用解析XML,在PHP中由实现(参见LibXML2 at),其接口是,接近SAX标准API

    使用“LibXML2的SAX”和另一个接口(而不是传统的SAX接口)的另一种方法是使用。看



    是的,PHP手册中没有表达术语“SAX”或“SAXAPI”(!)。看。

    是的,他们应该这么做。如果您知道问题所在,您可以尝试使用regexp查找/替换所有文件。但这本来就不应该是你关心的问题。嘿,Rémi,在你将其推送到xml加载器之前,你不能读取字符串,从而添加CDATA部分吗?是的,这就是我一直在思考的问题,也是我现在正在做的事情,但我仍然希望有比逐字读取XML或用regexp查找/替换更好的方法:)请参阅类似(最古老的)问题:ops,您可以对大文件使用整洁的扩展名(请参阅下面的答案)。您可以使用PHP作为命令,通过终端将HTML文件转换为XHTML。