每个parentNode都有PHP replaceChild
发布时间:2020-12-13 17:09:59 所属栏目:PHP教程 来源:网络整理
导读:我正在使用此 PHP代码替换XML文件中的一系列节点: ?php$xml = "productsproductItemId531670/ItemIdmodelNumberMETRA ELECTRONICS/MOBILE AUDIO/modelNumbernameBuy/namenameCar,Marine amp; GPS/namenameCar Installation Parts/namenameDeck Installation
我正在使用此
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; ?> 但是,此代码仅替换并且仅适用于一个产品集. 上面的代码将打印出这个:(注意第一组名称节点已经消失,并被指定的新节点替换) <?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(); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |