【问题标题】:How can I parse large XML files in PHP?如何在 PHP 中解析大型 XML 文件?
【发布时间】:2010-11-16 22:16:45
【问题描述】:

我正在解析一个大约 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 对象,但我不知道如何使用数据到达实际节点?

【问题讨论】:

    标签: php xml


    【解决方案1】:

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

    【讨论】:

    • 我应该将它转换为一个数组,然后解析它并填充我的数据库还是解析实际的 XML?
    • 不!重点是您逐个实体地处理它,使用循环从 XML 中检索您需要的内容以将每一行插入数据库,然后执行插入。这样,您不会将整个内容加载到内存中并用完 PHP 的限制
    【解决方案2】:

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

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

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

    【讨论】:

    • 我做 $dom->element->subelement 它只是不输出数据。
    • 子元素引用可能有点棘手,我承认。如果 XML 看起来像 <Top><Group><Item><Value>1</Value></Item><Item><Value>2</Value></Item></Group></Top>,那么您将获得第二个带有 $dom->Group->Item[1]->ValueValue 标记
    猜你喜欢
    • 2014-07-11
    • 2011-05-06
    • 2011-05-09
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    相关资源
    最近更新 更多