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

问题描述:

我通过一个约12mb大的XML文件进行解析。我需要解析整个文件并在MySQL数据库中存储我所需要的内容。如何解析PHP中的大型XML文件?

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

这很好,当XML是非常小,但它只是停止行为时,我运行我的12MB文件。

我尝试了将XML转换为我在网上找到的数组并且它们都不工作的多个函数。

这是我有两个不同的XML到阵列的功能得到了一个常见的错误我在网上找到:

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'); 
} 

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

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

+0

我应该将它转换为数组,然后解析它并填充我的数据库或解析实际的XML? – vick 2010-11-16 22:26:05

+1

不!整个过程就是你通过实体处理实体,使用循环从XML中检索需要的内容,将每行插入到数据库中,然后执行插入操作。这样,你没有把整个东西加载到内存中,并使用PHP的限制 – 2010-11-16 22:41:51

+0

我更新了这篇文章,你可以看一下吗? – vick 2010-11-16 23:44:35

SimpleXML是黑盒子代码的一个很好的例子,它在封面上做了一些神奇的事情,使它看起来更简单。换句话说,不要做一个SimpleXML对象的var_dump();你会感到困惑。

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

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

+0

我做$ dom-> element-> subelement它只是不输出数据。 – vick 2010-11-18 18:07:00

+0

我承认,子元素引用可能有点棘手。随着XML,看起来像'',那么你会得到与'$ dom->集团 - >第[1]第二个'Value'标签 - > Value' – staticsan 2010-11-18 23:42:18