2011-12-07 74 views
2

當我使用它來解析一個大的XML文件時,這段代碼會產生不合理的結果。php domdocument不能正確解析

被解析看起來像這樣的XML:

<product> 
<ItemId>1576829</ItemId> 
<modelNumber>CX501</modelNumber> 
<categoryPath><category><name>Buy</name></category> 
<category><name>Car, Marine &amp; 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 &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; 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 &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 

每名節點,不屬於產品節點內追加。

+0

「不起作用」是什麼意思?怎麼了?出現什麼錯誤? –

+0

什麼是「不成功的結果」?你爲什麼使用file_put_contents來寫文件?上面的代碼是做什麼的? – Gordon

+0

我更新了答案。該代碼使用轉換後的XML編寫一個新文件 – Ben

回答

1

這是行不通的嗎?

// 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 &amp; 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 &amp; 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>'; 

測試c。 100 <product>有下列結果的標籤:

<?xml version="1.0"?> 
<products> 
    <product> 
<ItemId>1576829</ItemId> 
<modelNumber>CX501</modelNumber> 

<name>Buy</name> 
    <name>Car, Marine &amp; 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 &amp; GPS</name> 
    <name>Car Audio</name> 
    <name>Car Stereos</name> 
    <name>CD Decks</name> 
    </product> 

    // etc 
</products> 
+0

我用3測試了它。現在我用整個XML文件運行它。這需要很長時間。 – Ben