当我使用这段代码解析一个大的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>每个name节点都不会附加在product节点中。
发布于 2011-12-07 19:53:54
这行得通吗?
// load up your XML
$xml = new DOMDocument;
$xml->loadXml('
<products>
<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>
<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>
</products>
');
// Array to store them
foreach ($xml->getElementsByTagName('product') as $product )
{
$append = array();
foreach($product->getElementsByTagName('name') as $name ) {
// Stick $name onto the array
$append[] = $name;
}
foreach ($append as $a) {
// Now append all of them to product
$product->appendChild($a);
}
$product->removeChild($xml->getElementsByTagName('categoryPath')->item(0));
}
// final result:
$result = $xml->saveXML();
echo '<pre>'.print_r(htmlspecialchars($result),1).'</pre>';在约100个<product>标签上进行测试,结果如下:
<?xml version="1.0"?>
<products>
<product>
<ItemId>1576829</ItemId>
<modelNumber>CX501</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Audio</name>
<name>Car Stereos</name>
<name>CD Decks</name>
</product>
<product>
<ItemId>1576829</ItemId>
<modelNumber>CX501</modelNumber>
<name>Buy</name>
<name>Car, Marine & GPS</name>
<name>Car Audio</name>
<name>Car Stereos</name>
<name>CD Decks</name>
</product>
// etc
</products>https://stackoverflow.com/questions/8413365
复制相似问题