當我使用它來解析一個大的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