PHPCon Poland 2024

DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild Adiciona um novo filho ao final dos filhos

Descrição

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

Esta função acrescenta um filho a uma lista existente de filhos, ou cria uma nova lista de filhos. O filho pode ser criado, por exemplo, com DOMDocument::createElement(), DOMDocument::createTextNode() etc. ou simplesmente pode usaando-se qualquer outro nó.

Ao usar um nó existente ele será movido.

Parâmetros

node

O nó filho anexado.

Valor Retornado

O nó adicionado ou false em caso de erro.

Erros/Exceções

DOM_NO_MODIFICATION_ALLOWED_ERR

Lançado se este nó for somente leitura, ou se o pai anterior do nó que está sendo inserido for somente leitura.

DOM_HIERARCHY_REQUEST_ERR

Lançada se este nó for de um tipo que não permite que filhos do tipo do node, ou se o nó a ser anexado for um dos ancestrais deste nó, ou se for este próprio nó.

DOM_WRONG_DOCUMENT_ERR

Lançado se node foi criado por um documento diferente do documento que criou este nó.

Exemplos

O exemplo a seguir irá adicionar um novo nó de elemento de um documento novo.

Exemplo #1 Adicionando um nó filho

<?php

$doc
= new DOMDocument;

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

echo
$doc->saveXML();
?>

Exemplo #2 Filhos aninhados

<?php

$doc
= new DOMDocument;

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

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

echo
$doc->saveXML();
?>

Veja Também

add a note

User Contributed Notes 4 notes

up
19
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
8
cweiske at php dot net
6 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
4
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
3
frame at dynamiccreated dot de
13 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