This function behaves differently depending on PHP version:
- It forgets attributes of the new node in PHP 5.2,
- but copies them in PHP 5.3.
(at least when looking at the SimpleXMLElement mirror of the DOM being changed in DOM (by lack of equivalent methods in SimpleXMLElement).
Annoying different behavior / bug, but good to know. Would be good to update the doc about what the wanted behavor is
In both versions, children nodes are not coming together with the new node and need to be added one by one recursively. Just good to know too.
DomNode::replace_child
(PHP 4 >= 4.2.0)
DomNode::replace_child — Remplace un noeud fils
Description
(PHP 4.2) Cette fonction remplace le noeud fils oldnode
avec le nouveau noeud newnode. Si le nouveau
noeud est déjà un fils, il ne sera pas ajouté une seconde fois. Si
l'ancien noeud ne peut être trouvé, la fonction
retournera FALSE. Si le remplacement a pu avoir lieu,
oldnode est retourné.
(PHP 4.3) Cette fonction remplace le noeud fils oldnode
avec le nouveau noeud newnode, même si newnode
est déjà fils. Si le nouveau noeud est déjà inséré dans le document, il sera retiré
de son contexte courant. Si DomNode->replace_child() ne
peut trouver l'ancien noeud, elle retournera FALSE. Si le remplacement a pu avoir lieu,
oldnode est retourné.
(Ce comportement est conforme aux spécifications W3C).
Voir aussi domnode_append_child().
There's a bug in the docs here. The order of arguments is the other way round i.e.
object DomNode->replace_child ( object newnode, object oldnode)
Here's an example of it working:
<?php
$doc = domxml_new_doc("1.0");
$root = $doc->create_element("HTML");
$doc->append_child($root);
$head = $doc->create_element("HEAD");
$root->append_child($head);
$title = $doc->create_element("TITLE");
$head->append_child($title);
$text = $doc->create_text_node("This is the title");
$title->append_child($text);
echo "<PRE>";
echo htmlentities($doc->dump_mem(true));
echo "</PRE>";
$newtitle = $doc->create_text_node("No, this is the title");
// object DomNode->replace_child ( object newnode, object oldnode)
$title->replace_child($newtitle,$title->first_child());
echo "<PRE>";
echo htmlentities($doc->dump_mem(true));
echo "</PRE>";
?>
