DOMNode::appendChild
(PHP 5, PHP 7)
DOMNode::appendChild — Добавляет новый дочерний узел в конец списка потомков
Описание
Функция добавляет дочерний узел к существующему списку потомков или создает новый список. Дочерний узел может быть создан с помощью DOMDocument::createElement(), DOMDocument::createTextNode() и т.д., или может быть использован любой другой узел.
Список параметров
-
newnode
-
Добавляемый дочерний узел.
Возвращаемые значения
Добавленный узел.
Ошибки
-
DOM_NO_MODIFICATION_ALLOWED_ERR
-
Возникает, если узел доступен только для чтения или предыдущий родитель вставляемого узла доступен только для чтения.
-
DOM_HIERARCHY_REQUEST_ERR
-
Возникает, если тип узла не поддерживает потомков типа, который имеет узел
newnode
, или же если добавляемый узел является предком целевого узла или им самим. -
DOM_WRONG_DOCUMENT_ERR
-
Возникает, если
newnode
создан в другом документе, отличном от того, в котором был создан этот узел.
Примеры
Следующий пример добавляет новый узел в только что созданный документ.
Пример #1 Добавление дочернего узла
<?php
$doc = new DOMDocument;
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
echo $doc->saveXML();
?>
Смотрите также
- DOMNode::insertBefore() - Добавляет новый дочерний узел перед опорным узлом
- DOMNode::removeChild() - Удаляет дочерний узел из списка потомков
- DOMNode::replaceChild() - Заменяет дочерний узел
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Обработка XML
- Document Object Model
- Функция DOMNode::appendChild() - Добавляет новый дочерний узел в конец списка потомков
- Функция DOMNode::C14N() - Canonicalize nodes to a string
- Функция DOMNode::C14NFile() - Canonicalize nodes to a file
- Функция DOMNode::cloneNode() - Клонирует узел
- Функция DOMNode::getLineNo() - Возвращает номер строки узла
- Функция DOMNode::getNodePath() - Получение XPath пути к узлу
- Функция DOMNode::hasAttributes() - Проверяет, содержит ли данный узел атрибуты
- Функция DOMNode::hasChildNodes() - Проверяет, содержит ли данный узел потомков
- Функция DOMNode::insertBefore() - Добавляет новый дочерний узел перед опорным узлом
- Функция DOMNode::isDefaultNamespace() - Проверяет, совпадает ли URI пространства имен узла с пространством имен по умолчанию
- Функция DOMNode::isSameNode() - Проверяет, являются ли два узла одним и тем же узлом
- Функция DOMNode::isSupported() - Проверяет, поддерживается ли заданное свойство в определенной версии
- Функция DOMNode::lookupNamespaceURI() - Получает URI пространства имен узла по префиксу
- Функция DOMNode::lookupPrefix() - Возвращает префикс пространства имен узла из URI пространства имен
- Функция DOMNode::normalize() - Нормализует узел
- Функция DOMNode::removeChild() - Удаляет дочерний узел из списка потомков
- Функция DOMNode::replaceChild() - Заменяет дочерний узел
Коментарии
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>
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
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.
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);
}
?>