2011-12-07 44 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(); 
}