我正在使用此
PHP代码替换XML文件中的一系列节点:
<?php $xml = " <products> <product> <ItemId>531670</ItemId> <modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> <name>Buy</name> <name>Car,Marine & GPS</name> <name>Car Installation Parts</name> <name>Deck Installation Parts</name> <name>Antennas & Adapters</name> </product> <product> <ItemId>531670</ItemId> <modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> <name>Buy</name> <name>Car,Marine & GPS</name> <name>Car Installation Parts</name> <name>Deck Installation Parts</name> <name>Antennas & Adapters</name> </product> <product> <ItemId>531670</ItemId> <modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> <name>Buy</name> <name>Car,Marine & GPS</name> <name>Car Installation Parts</name> <name>Deck Installation Parts</name> <name>Antennas & 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,'parentCategory'); $xml = renameTags($xml,'Category'); $xml = renameTags($xml,'subCategory'); $xml = renameTags($xml,'sisterCategory'); echo $xml; ?>
但是,此代码仅替换并且仅适用于一个产品集.
我想我需要在函数中的某个地方调用foreach语句,该函数由foreach parentNode(‘product’)替换标记名称.我需要为函数添加什么来迭代所有产品集?
上面的代码将打印出这个:(注意第一组名称节点已经消失,并被指定的新节点替换)
<?xml version="1.0"?> <products> <product> <ItemId>531670</ItemId> <modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> <Source>Buy</Source> <parentCategory>Car,Marine & GPS</parentCategory> <Category>Car Installation Parts</Category> <subCategory>Deck Installation Parts</subCategory> <sisterCategory>Antennas & Adapters</sisterCategory></product> <product> <ItemId>531670</ItemId> <modelNumber>METRA ELECTRONICS/MOBILE AUDIO</modelNumber> <name>Buy</name> <name>Car,Marine & GPS</name> <name>Car Installation Parts</name> <name>Deck Installation Parts</name> <name>Antennas & Adapters</name> </product> </products>
如您所见,它只替换了一个产品实例.
解决方法
那个foreach的突破是你的问题:它停在了第一个< name>它遇到的节点,无论它在文档中的位置.
首先,您必须遍历产品,然后通过产品的< name>节点.类似于以下内容:
function renameTags($xml,$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(); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。