当我使用它来解析一个大的XML文件时,这段代码会产生不合理的结果。php domdocument不能正确解析
被解析看起来像这样的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来写文件?上面的代码是做什么的? – Gordon
我更新了答案。该代码使用转换后的XML编写一个新文件 – Ben