How do I change XML tag names with PHP? How do I change XML tag names with PHP? php php

How do I change XML tag names with PHP?


There are two issues with Kris and dfsq code:

  • Only first child node will be copied - solved with temporary copy of $childNodes)
  • Children will get xmlns tag - solved by replacing node at the beginning - so it's connected to the document

A corrected renaming function is:

function renameTag( DOMElement $oldTag, $newTagName ) {    $document = $oldTag->ownerDocument;    $newTag = $document->createElement($newTagName);    $oldTag->parentNode->replaceChild($newTag, $oldTag);    foreach ($oldTag->attributes as $attribute) {        $newTag->setAttribute($attribute->name, $attribute->value);    }    foreach (iterator_to_array($oldTag->childNodes) as $child) {        $newTag->appendChild($oldTag->removeChild($child));    }    return $newTag;}


Next function will do the trick:

/** * @param $xml string Your XML * @param $old string Name of the old tag * @param $new string Name of the new tag * @return string New XML */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;    }    foreach ($toRemove as $node)    {        $node->parentNode->removeChild($node);    }    return $dom->saveXML();}// Load XML from file data.xml$xml = file_get_contents('data.xml');$xml = renameTags($xml, 'modelNumber', 'number');$xml = renameTags($xml, 'salePrice', 'price');echo '<pre>'; print_r(htmlspecialchars($xml)); echo '</pre>';


There is some sample code that works in my question over here, but there is no direct way of changing a tag name through DOMDocument/DOMElement, you can however copy elements with a new tagname as shown.

basically you have to:

function renameTag(DOMElement $oldTag, $newTagName){    $document = $oldTag->ownerDocument;    $newTag = $document->createElement($newTagName);    foreach($oldTag->attributes as $attribute)    {        $newTag->setAttribute($attribute->name, $attribute->value);    }    foreach($oldTag->childNodes as $child)    {        $newTag->appendChild($oldTag->removeChild($child));    }    $oldTag->parentNode->replaceChild($newTag, $oldTag);    return $newTag;}