DOMNode::appendChild

(PHP 5, PHP 7, PHP 8)

DOMNode::appendChild β€” ДобавляСт Π½ΠΎΠ²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π» Π² ΠΊΠΎΠ½Π΅Ρ† списка ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

ОписаниС

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

Ѐункция добавляСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π» Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ список ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² ΠΈΠ»ΠΈ создаёт Π½ΠΎΠ²Ρ‹ΠΉ список Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… элСмСнтов. Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ создан с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ DOMDocument::createElement(), DOMDocument::createTextNode() ΠΈ Ρ‚.Π΄., ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΡƒΠ·Π΅Π».

ΠŸΡ€ΠΈ использовании ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Ρ‘Π½.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

node

ДобавляСмый Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π».

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΡƒΠ·Π΅Π» ΠΈΠ»ΠΈ false Π² случаС возникновСния ошибки.

Ошибки

ΠœΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ DOMException со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΊΠΎΠ΄Π°ΠΌΠΈ ошибок:

DOM_NO_MODIFICATION_ALLOWED_ERR

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли ΡƒΠ·Π΅Π» доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ вставляСмого ΡƒΠ·Π»Π° доступСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния.

DOM_HIERARCHY_REQUEST_ERR

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли Ρ‚ΠΈΠΏ ΡƒΠ·Π»Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ² Ρ‚ΠΈΠΏΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡƒΠ·Π΅Π» node, ΠΈΠ»ΠΈ Ссли добавляСмый ΡƒΠ·Π΅Π» являСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ Ρ†Π΅Π»Π΅Π²ΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΈΠ»ΠΈ ΠΈΠΌ самим.

DOM_WRONG_DOCUMENT_ERR

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚, Ссли node создан Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π» создан этот ΡƒΠ·Π΅Π».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ добавляСт Π½ΠΎΠ²Ρ‹ΠΉ ΡƒΠ·Π΅Π» Π² Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ созданный Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΄ΠΎΡ‡Π΅Ρ€Π½Π΅Π³ΠΎ ΡƒΠ·Π»Π°

<?php

$doc
= new DOMDocument;

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

echo
$doc->saveXML();
?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΡƒΠ·Π»Ρ‹

<?php

$doc
= new DOMDocument;

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

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

echo
$doc->saveXML();
?>

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

  • DOMChildNode::after() - ДобавляСт ΡƒΠ·Π»Ρ‹ послС ΡƒΠ·Π»Π°
  • DOMNode::insertBefore() - ДобавляСт Π½ΠΎΠ²Ρ‹ΠΉ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ
  • DOMNode::removeChild() - УдаляСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π» ΠΈΠ· списка ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²
  • DOMNode::replaceChild() - ЗамСняСт Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΉ ΡƒΠ·Π΅Π»
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 4 notes

up
20
krisdover at hotmail dot com ΒΆ
18 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 ΒΆ
8 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
frame at dynamiccreated dot de ΒΆ
15 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.
up
3
jrtayloriv at gmail dot com ΒΆ
18 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>