【问题标题】:PHP replaceChild for each parentNode每个父节点的 PHP replaceChild
【发布时间】:2012-01-15 00:19:38
【问题描述】:

我正在使用这个 PHP 代码替换 XML 文件中的一系列节点:

<?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') 替换标签名称组成的语句。我需要为函数添加什么来迭代所有产品集?

上面的代码会打印出这样的:(注意第一组名字节点已经消失了,被指定的新节点代替了)

<?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>

如您所见,它只替换了一个产品实例。

【问题讨论】:

    标签: php xml domdocument


    【解决方案1】:

    那个 foreach 的中断是你的问题:它停在它遇到的第一个 &lt;name&gt; 节点,不管它在文档中的什么位置。

    首先,您必须遍历产品,然后遍历产品的 &lt;name&gt; 节点。类似于以下内容:

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多