【发布时间】:2012-01-14 20:22:49
【问题描述】:
当我使用它来解析大型 XML 文件时,此代码会产生低效的结果。
解析的 XML 如下所示:
<product>
<ItemId>1576829</ItemId>
<modelNumber>CX501</modelNumber>
<categoryPath><category><name>Buy</name></category>
<category><name>Car, Marine & GPS</name></category>
<category><name>Car Audio</name></category>
<category><name>Car Stereos</name></category>
<category><name>CD Decks</name></category></categoryPath>
</product>
大约有100套产品(所以基本上上面的xml乘以100)
当只有大约 3-5 套产品时,此代码有效,但在尺寸增加时无效。 为什么它不适用于更大的文件?
<?php
set_time_limit(0);
// load up your XML
$xml = new DOMDocument;
$xml->load('file.xml');
// Array to store them
$append = array();
foreach ($xml->getElementsByTagName('product') as $product )
{
foreach($product->getElementsByTagName('name') as $name ) {
// Stick $name onto the array
$append[] = $name;
}
// Now append all of them to product
foreach ($append as $a)
{
$product->appendChild($a);
}
$product->removeChild($xml->getElementsByTagName('categoryPath')->item(0));
}
// final result:
$result = $xml->saveXML();
echo $result;
$file = "new_file.xml";
file_put_contents($file,$result);
?>
执行此代码后,每个产品集的 XML 文件应该如下所示
<?xml version='1.0'?>
<products>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
<name>Buy</name></category>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
</product>
</products>
但是,当我使用这个 PHP 代码解析一个相当大的 xml 文件(一个包含 100 组产品的文件)时,它会获取 categoryPath 节点及其子节点并将它们附加到文件的底部,而不管它应该是什么节点进入(产品) 如果我只解析一个小的 XML 文件(一个有 3 套产品),那么我会得到想要的结果(上面的 XML 代码是这个 PHP 代码应该做的,但是当有一个大文件时它不起作用)。
当我尝试解析包含 100 个产品集的 XML 文件时,结果如下所示:
<?xml version='1.0'?>
<products>
<product>
<ItemId>531670</ItemId>
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber>
</product>
</products>
<name>Buy</name></category>
<name>Car, Marine & GPS</name>
<name>Car Installation Parts</name>
<name>Deck Installation Parts</name>
<name>Antennas & Adapters</name>
每个名称节点都没有附加到产品节点内。
【问题讨论】:
-
“它不起作用”到底是什么意思?发生什么了?出现什么错误?
-
什么是“无效结果”?为什么要使用 file_put_contents 来写入文件?上面的代码到底在做什么?
-
我更新了答案。代码用转换后的 XML 写入一个新文件
-
感谢您的更新,但“它无法正常工作”不足以作为描述。
标签: php xml dom domdocument