DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild Ajoute un nouveau fils à la fin des fils

Description

public DOMNode::appendChild(DOMNode $node): DOMNode|false

Cette fonction ajoute un fils à une liste de fils existante ou crée une nouvelle liste de fils. Le fils peut être créé avec, e.g. DOMDocument::createElement(), DOMDocument::createTextNode(), etc. ou simplement en utilisant tout autre nœud.

Lors de l'utilisation d'un nœud existant, il sera supprimé.

Liste de paramètres

node

Le nœud fils à ajouter.

Valeurs de retour

Le nœud fils ajouté ou false en cas d'erreur.

Erreurs / Exceptions

DOM_NO_MODIFICATION_ALLOWED_ERR

Lancé si le nœud est en lecture seule ou si le parent précédent le nœud à insérer est en lecture seule.

DOM_HIERARCHY_REQUEST_ERR

Lancé si le nœud est d'un type qui n'autorise pas d'enfant du type du nœud node, ou si le nœud à ajouter est un des nœuds ancêtres ou ce nœud lui-même.

DOM_WRONG_DOCUMENT_ERR

Lancé si node a été créé depuis un document différent que celui qui a créé ce nœud.

Exemples

L'exemple suivant ajoutera un nouveau nœud à un document nouveau.

Exemple #1 Ajout d'un fils

<?php

$doc
= new DOMDocument;

$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);

echo
$doc->saveXML();
?>

Exemple #2 Enfant imbriqué

<?php

$doc
= new DOMDocument;

$headNode = $doc->createElement("head");
$doc->appendChild($headNode);

$titleNode = $doc->createElement("title");
$headNode->appendChild($titleNode);

echo
$doc->saveXML();
?>

Voir aussi

add a note add a note

User Contributed Notes 4 notes

up
18
krisdover at hotmail dot com
16 years ago
What's not mentioned here is that DOMNode::appendChild() can also be used to move an existing node to another part of the DOMDocument, e.g.

<?php
$doc
= new DOMDocument();
$doc->loadXML("<foobar><bar/><foo/></foobar>");
$bar = $doc->documentElement->firstChild;
$foo = $doc->documentElement->lastChild;
$foo->appendChild($bar);
print
$doc->saveXML();
?>

This produces:

<?xml version="1.0"?>
<foobar><foo><bar/></foo></foobar>

Note that the nodes "<foo/>" and "<bar/>" were siblings, i.e. the first and last child of "<foobar>" but using appendChild() we were able to move "<bar/>" so that it is a child of "<foo/>".

This saves you the trouble of doing a DOMNode::removeChild($bar) to remove "<bar/>" before appending it as a child of "<foo/>".

Kris Dover
up
7
cweiske at php dot net
7 years ago
If you want to move the children of one node to another, you cannot simply iterate on $element->childNodes - you have to make an array first:

<?php
$children
= [];
foreach (
$elemWithChildren->childNodes as $child) {
   
$children[] = $child;
}
foreach (
$children as $child) {
   
$targetElement->appendChild($child);
}
?>
up
3
jrtayloriv at gmail dot com
16 years ago
If you want to create nested DOM elements:

<?php
    $doc
= new DOMDocument();
   
   
$foo = $doc->createElement("foo");
   
$doc->appendChild($foo);

   
$bar = $doc->createElement("bar");
   
$foo->appendChild($bar);

   
$bazz = $doc->createElement("bazz");
   
$foo->appendChild($bazz);

    echo
$doc->saveXML();
?>

Is equivalent to:

<foo>
  <bar></bar>
  <bazz></bazz>
</foo>
up
1
frame at dynamiccreated dot de
14 years ago
Aware dealing with DOMNodeList and appendChild() on the same Node.

If you want to replace only the children not the DOMElement itself you probably foreach childNodes-property or get the DOMElements with a for-loop and item()-method of the DOMNodeList.

You will fail if you not clone the received single DOMElement. Actually the count of the DOMNodelist will be decreased on appendChild count but appendChild seems to refer to the old Nodelist and nothing visible will happen. Cloning will help.
To Top