2011-12-07 45 views
4

我使用這個PHP代碼來替換一系列節點在一個XML文件:PHP的replaceChild每個parentNode

<?php 
$xml = " 
<products> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
</products> 
"; 
function renameTags($xml, $old, $new) 
{ 
$dom = new DOMDocument(); 
$dom->loadXML($xml); 

$nodes = $dom->getElementsByTagName($old); 

$toRemove = array(); 

foreach ($nodes as $node) 
{ 
$newNode = $dom->createElement($new); 

foreach ($node->attributes as $attribute) 
{ 
    $newNode->setAttribute($attribute->name, $attribute->value); 
} 

foreach ($node->childNodes as $child) 
{ 
    $newNode->appendChild($node->removeChild($child)); 
} 

$node->parentNode->appendChild($newNode); 
$toRemove[] = $node; 
    break; 

} 

foreach ($toRemove as $node) 
{ 
    $node->parentNode->removeChild($node); 

} 

$dom->formatOutput = TRUE; 
return $dom->saveXML(); 
} 

$xml = renameTags($xml, 'name', 'Source'); 
$xml = renameTags($xml, 'name', 'parentCategory'); 
$xml = renameTags($xml, 'name', 'Category'); 
$xml = renameTags($xml, 'name', 'subCategory'); 
$xml = renameTags($xml, 'name', 'sisterCategory'); 

echo $xml; 
?> 

然而,這個代碼只替換並只適用於一個產品組。 我想我需要在由foreach parentNode('product')替換標籤名稱的函數中的某處調用foreach語句。我需要添加什麼函數來遍歷所有產品集?

上面的代碼將打印:(注意第一個集名稱節點都不見了,並通過指定的新節點替換)

<?xml version="1.0"?> 
<products> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<Source>Buy</Source> 
<parentCategory>Car, Marine &amp; GPS</parentCategory> 
<Category>Car Installation Parts</Category> 
<subCategory>Deck Installation Parts</subCategory> 
<sisterCategory>Antennas &amp; Adapters</sisterCategory></product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
<product> 
<ItemId>531670</ItemId> 
<modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> 
<name>Buy</name> 
<name>Car, Marine &amp; GPS</name> 
<name>Car Installation Parts</name> 
<name>Deck Installation Parts</name> 
<name>Antennas &amp; Adapters</name> 
</product> 
</products> 

正如你所看到的,只是取代的一個實例產品。

+0

顯示您的表現如何? – 2011-12-07 13:40:00

回答

4

該foreach的突破是你的問題:無論它在文檔中的位置如何,它在遇到的第一個<name>節點處停止。

首先,您必須遍歷產品,然後遍歷產品的<name>節點。類似以下內容:

function renameTags($xml, $old, $new) { 
    $toRemove = array(); 
    $dom = new DOMDocument(); 
    $dom->loadXML($xml); 
    $products = $dom->getElementsByTagName('product'); 

    foreach($products as $product) { 
     $nodes = $product->getElementsByTagName($old); 

     foreach ($nodes as $node) { 
      $newNode = $dom->createElement($new); 

      foreach ($node->attributes as $attribute) { 
       $newNode->setAttribute($attribute->name, $attribute->value); 
      } 

      foreach ($node->childNodes as $child) { 
       $newNode->appendChild($node->removeChild($child)); 
      } 

      $node->parentNode->appendChild($newNode); 
      $toRemove[] = $node; 

      break; 
     } 
    } 

    foreach ($toRemove as $node) { 
     $node->parentNode->removeChild($node); 
    } 

    $dom->formatOutput = TRUE; 
    return $dom->saveXML(); 
}