PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

DomNode->append_sibling> <DomNode->add_namespace
Last updated: Fri, 20 Jun 2008

view this page in

DomNode->append_child

(No version information available, might be only in CVS)

DomNode->append_child — Ajoute un nouveau fils à la fin des enfants

Description

DOMNode
DOMNode append_child ( DOMNode $newnode )

Cette fonction ajoute un fils à une liste existante de fils ou crée une nouvelle liste de fils.

Liste de paramètres

newnode

Le noeud qui sera ajouté. Il peut être créé avec DomDocument->create_element, DomDocument->create_text_node etc. ou simplement en utilisant un autre noeud.

Note: Vous ne pouvez pas ajouter un DOMAttribute en utilisant cette méthode. Utilisez DomElement->set_attribute() à la place.

Valeurs de retour

Retourne le noeud ajouté en cas de succès ou FALSE en cas d'échec.

Historique

Version Description
4.3.0 Vous n'êtes plus autorisé d'insérer un noeud à partir d'un autre document.
4.3.0 Avant PHP 4.3.0, le nouveau fils est dupliqué avant d'être ajouté. Par conséquent, le nouveau fils est une copie qui peut être modifiée sans altérer le noeud utilisé dans cette fonction. Si le noeud passé a des fils, ils seront aussi dupliqués, ce qui rend cette fonction pratique pour copier des documents XML complexes. La valeur retournée est le noeud fils ajouté. Si vous voulez apporter des modifications au noeud fils, vous devez utiliser le noeud retourné.
4.3.0 et 4.3.1 Le nouveau fils newnode est d'abord déconnecté de son contexte, s'il est déjà fils d'un DomNode. Le noeud est donc déplacé et n'est plus copié. Ceci est le comportement qui correspond aux spécifications W3C. Si vous avez besoin de l'ancien comportement, utilisez DomNode->clone_node avant d'ajouter.
4.3.2 Le nouveau fils newnode est d'abord déconnecté de son contexte, s'il est déjà dans l'arbre. Les mêmes règles s'appliquent.

Exemples

L'exemple suivant ajoute un nouveau noeud dans un document, et modifie son attribut align à left.

Exemple #1 Ajouter un noeud fils avec dom xml

<?php
$doc 
domxml_new_doc("1.0");
$node $doc->create_element("para");
$newnode $doc->append_child($node);
$newnode->set_attribute("align""left");
?>

L'exemple ci-dessus peut être aussi écrit comme ceci :

Exemple #2 Ajouter un noeud fils avec dom xml (méthode 2)

<?php
$doc 
domxml_new_doc("1.0");
$node $doc->create_element("para");
$node->set_attribute("align""left");
$newnode $doc->append_child($node);
?>

Un exemple plus complexe est celui ci-dessous. Il commence par rechercher un élément, le duplique avec ses fils, et l'ajoute comme frère. Finalement, un nouvel attribut est ajouté, et le document complet est publié.

Exemple #3 Ajouter un noeud fils avec DOM XML (exemple 3)

<?php
include("exemple.inc");

if(!
$dom domxml_open_mem($xmlstr)) {
  echo 
"Erreur lors de l'analyse du document\n";
  exit;
}

$elements $dom->get_elements_by_tagname("informaltable");
print_r($elements);
$element $elements[0];

$parent $element->parent_node();
$newnode $parent->append_child($element);
$children $newnode->children();
$attr $children[1]->set_attribute("align""left");

$xmlfile $dom->dump_mem();
echo 
htmlentities($xmlfile);
?>

L'exemple ci-dessus peut aussi être réalisé avec la fonction DomNode->insert_before au lieu de DomNode->append_child.

Migration vers PHP 5

Vous devriez utiliser DOMNode::appendChild.



add a note add a note User Contributed Notes
DomNode->append_child
andrew at transitionmedia dot co dot uk
12-Feb-2006 07:03
As of version 4.3 PHP doesn't support Appending a child from another source document. If you are trying to  import information from multiple sources into a final document [for transformation using XSL as an example] then you can have problems. This technique can be used to do it though.

I am assuming you have two documents open, $xmldoc1 and $xmldoc2 and you have selected [via XPath or explicit searching] the nodes you want in each document. Thus $xmldoc1_appending_node is the node you would like to add $xmldoc2_importnode to.

<?

// first we create a temporary node within the document we want to add to.
$temp_importnode = $xmldoc1->create_element("import");

// now we have a node that is in the right document context we can clone the one we want into this one.
$temp_importnode = $xmldoc_importnode->clone_node(true);

// by using true in the above call to clone_node() we copy all of the child nodes as well. Use false or nothing if you just want the containing node with no children.

$xmldoc1_appending->append_child($importnode);

?>

Now your document contains the new nodes imported from a different document.
wackysalut at bourget dot cc
01-Nov-2002 12:46
Be careful of the order you append childs. (PHP <= 4.2)

If you create let's say:

$x_html = $x_doc->create_element('html');
$x_head, $x_title, $x_meta, $x_link and $x_body in the same way.

If you:

$x_head->append_child($x_title);
$x_head->append_child($x_meta);
$x_head->append_child($x_link);

$x_html->append_child($x_head);

$x_body_backup = $x_html->append_child($x_body);

/* here */

$x_doc->append_child($x_html);

If you now try to modify $x_body_backup.. it will no longer be able to modify the actualy XML tree, because you appended the HTML tree to the DomDocument.. and it has copied ALL the nodes at the end of the DomDocument, so the reference you now have in $x_body_backup is not valid anymore! If you had modified it where the /* here */ line is.. the $x_body_backup would still be valid.. but not after the $x_doc->append_child($x_html);

What you can do is, reverse the order of your appendings.. so that you append the highest level node at the end.. so that your reference is still valid after, or wait till you have filled all of the nodes you wanted to add before you append it to your parent node.

DomNode->append_sibling> <DomNode->add_namespace
Last updated: Fri, 20 Jun 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites