views:

376

answers:

1

Hello,

In PHP with DOM, I have a DomElement object which represents an <identity/> element.

I have one case where I need to change this so its element name is <person/>, but keep the same child elements and attributes.

What would be the simplest way of changing an element name of a DomElement and keeping its children and attributes?

Edit: I have just found a very similar question (though it doesn't have very good answers).

+4  A: 

Could you use importNode() to copy the childNodes of your <identity> element to a newly created <person> element?

function changeName($node, $name) {
    $newnode = $node->ownerDocument->createElement($name);
    foreach ($node->childNodes as $child){
        $child = $node->ownerDocument->importNode($child, true);
        $newnode->appendChild($child, true);
    }
    foreach ($node->attributes as $attrName => $attrNode) {
        $newnode->setAttribute($attrName, $attrNode);
    }
    $newnode->ownerDocument->replaceChild($newnode, $node);
    return $newnode;
}

$domElement = changeName($domElement, 'person');

Perhaps something like that would work, or you could try using cloneChild().

Edit: Actually, I just realized that the original function would lose the placement of the node. As per the question thomasrutter linked to, replaceChild() should be used.

Calvin
I may be missing something, but it doesn't look like you can change the node name with importNode()
thomasrutter
See the code I just added.
Calvin
Thanks for that. I ended up using a solution very similar to this.
thomasrutter