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

时间:2010-11-16 22:16:46

标签: php xml

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

我正在将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');
}

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

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

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