Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 - Fatal编程技术网

如何在PHP中解析大型XML文件?

如何在PHP中解析大型XML文件?,php,xml,Php,Xml,我正在解析一个大约12mb大的XML文件。我需要解析整个文件,并将我认为必要的内容存储在MySQL数据库中 我正在将XML文件转换为数组。然后我解析数组并存储值 当XML非常小时,这种方法可以很好地工作,但当我运行12mb文件时,它就不再正常工作了 我尝试了多个将XML转换为在线找到的数组的函数,但都不起作用 这是我在网上发现的两个不同的XML to数组函数的常见错误: Fatal error: [] operator not supported for strings 我正在使用Simple

我正在解析一个大约12mb大的XML文件。我需要解析整个文件,并将我认为必要的内容存储在MySQL数据库中

我正在将XML文件转换为数组。然后我解析数组并存储值

当XML非常小时,这种方法可以很好地工作,但当我运行12mb文件时,它就不再正常工作了

我尝试了多个将XML转换为在线找到的数组的函数,但都不起作用

这是我在网上发现的两个不同的XML to数组函数的常见错误:

Fatal error: [] operator not supported for strings
我正在使用SimpleXML,有没有更好的解决方法?除了SimpleXML之外,还有其他功能强大到足以处理大型XML文件的库吗

我现在有:

$z = new XMLReader;
$z->open('feedfetch.xml');

$doc = new DOMDocument;
while ($z->read() && $z->name !== 'collection');
while ($z->name === 'collection')
{
    $node = simplexml_import_dom($doc->importNode($z->expand(), true));
    var_dump($node[0]);
    exit;

    $z->next('collection');
}

你看到我的var转储了吗?它回显一堆XML对象,但我不知道如何使用数据到达实际节点?

在处理大型XML文件时,从使用SimpleXML切换到使用SimpleXML。这是一个拉式解析器,它不会将整个文件加载到内存中进行处理。

SimpleXML是黑盒代码的一个很好的例子,它在幕后发挥了神奇的作用,使它看起来更简单。换句话说,不要对SimpleXML对象执行
var\u dump()
;你会感到困惑的

加载到SimpleXML中的XML文件可以像嵌套对象和对象数组一样使用。您可以使用
$dom->element->subelement
引用嵌套元素。是的,一开始感觉很有趣,但你很快就会习惯的。不过,您必须严格注意XML格式,否则可能会试图访问不存在的元素。这就是你的错误所在


不幸的是,SimpleXML将整个XML文件拉入内存并解析它。这给了您随机访问的优势,但代价是占用大量内存,可能是不必要的。也就是说,12Mb并没有超出SimpleXML的能力,您给出的错误消息也不是内存不足错误。

我应该将其转换为数组,然后通过数组进行解析并填充数据库还是解析实际的XML?不!关键是要逐个实体地处理它,使用循环从XML中检索所需内容以将每一行插入数据库,然后执行插入操作。这样,您就不会将整个内容加载到内存中,并使用PHP的limiti do$dom->element->subelement,它只是不输出数据。使用类似于
12
的XML,您将获得第二个
标记,该标记带有
$dom->Group->Item[1]->Value