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

3
我正在解析一个大约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_dump了吗?它会输出一堆XML对象,但我不知道如何获取实际包含数据的节点?

2个回答

3

在处理大型XML文件时,建议使用XMLReader代替SimpleXML。XMLReader是一种拉式解析器,不会将整个文件加载到内存中进行处理。


我应该将其转换为数组,然后解析并填充我的数据库,还是解析实际的XML? - vick
1
不!重点在于你需要逐个实体地处理它,使用循环从XML中检索所需内容以将每行插入数据库,然后进行插入。这样,你就不会将整个文件加载到内存中并使用PHP的限制。 - Mark Baker

0

SimpleXML是一个很好的黑盒代码示例,它在幕后执行魔法使其看起来比实际简单。换句话说,不要对SimpleXML对象进行var_dump()操作,否则你会感到困惑。

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

不幸的是,SimpleXML将整个XML文件加载到内存中并解析它。这为你提供了随机访问的优势,但代价是占用了大量的内存,可能是不必要的。话虽如此,12Mb并不超出SimpleXML的能力范围,而你给出的错误消息也不是内存不足的错误。


我执行 $dom->element->subelement,但它没有输出数据。 - vick
子元素引用可能有点棘手,我必须承认。对于像 <Top><Group><Item><Value>1</Value></Item><Item><Value>2</Value></Item></Group></Top> 这样的 XML,你可以使用 $dom->Group->Item[1]->Value 获取第二个 Value 标签。 - staticsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接