【发布时间】:2017-11-08 20:56:13
【问题描述】:
我正在尝试处理一个大的 (20mb+) XML 文件,但由于它的大小而无法解析它。我想把它分解成更小的部分,比如每个文件 100 个属性节点。
目前我正在使用下面的代码根据其他标准分离文件,但我有点不确定如何继续调整代码以执行每个文件拆分 100 条记录:
$destination = new DOMDocument;
$destination->preserveWhiteSpace = true;
$destination->loadXML('<?xml version="1.0" encoding="utf-8"?><root></root>');
$source = new DOMDocument;
$source->load('bes1c8ca168f910.xml');
$xp = new DOMXPath($source);
$destRoot = $destination->getElementsByTagName("root")->item(0);
foreach ($xp->query('/root/property[rent]') as $item) {
$newItem = $destination->importNode($item, true);
$destRoot->appendChild($newItem);
$item->parentNode->removeChild($item);
}
$source->save("sales.xml");
$destination->formatOutput = true;
$destination->save("rentals.xml");
感谢任何建议。
【问题讨论】:
-
如果您因为它的大小而在解析它时遇到问题,那么我不确定是否尝试再次拆分它使用解析器是解决方案。无论如何,如果你想尝试,那么它非常简单 - 在节点上的循环中保留一个计数器,当它达到 100 时,是时候关闭并保存当前文档,然后开始一个新文档...
-
考虑使用 XMLReader 将整个文件解析为一个片段,而不是拆分它。看看像stackoverflow.com/questions/1835177/how-to-use-xmlreader-in-php 这样的东西,它展示了如何读取一个大文件,但仍然以块的形式处理它。
-
OP - 我调整了我的答案,现在 PHP 将参数传递给外部 XSLT 脚本以执行类似于 PHP 将参数绑定到 SQL 语句的拆分。 XSLT 和 SQL 作为专用的声明性语言具有相似之处。我知道 XSLT 是新的和强大的,但给它一个机会。
标签: php xml domdocument