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.
DOMNode::appendChild
(PHP 5)
DOMNode::appendChild — Listenin sonuna yeni bir çocuk ekler
Açıklama
Listeye yeni bir çocuk ekler; liste yoksa oluşturulur. Çocuk DOMDocument::createElement(), DOMDocument::createTextNode() gibi yöntemlerle oluşturulabileceği gibi oluşturulmuş diğer düğümlerden biri de olabilir.
Değiştirgeler
-
yeni -
Listeye eklenecek çocuk.
Dönen Değerler
Eklenen düğüm.
Hatalar/İstisnalar
-
DOM_NO_MODIFICATION_ALLOWED_ERR -
Düğüm salt okunursa veya düğümün önceki ebeveyni salt okunur olarak yerleştirilmişse bu hata oluşur.
-
DOM_HIERARCHY_REQUEST_ERR -
Düğüm,
yenidüğümün türündeki çocuk düğümlere izin vermeyen türde ise veyayenidüğüm, çocuğu olacağı düğümün ebeveyni veya atalarından biri ise bu hata oluşur. -
DOM_WRONG_DOCUMENT_ERR -
Eğer
yenidüğüm, çocuğu olacağı düğümü oluşturan belgeden farklı bir belge tarafından oluşturulmuşsa bu hata oluşur.
Örnekler
Aşağıdaki örnekte yeni bir belgeye yeni bir eleman düğümü eklenmektedir.
Örnek 1 - Bir çocuk düğüm eklemek
<?php
$doc = new DOMDocument;
$node = $doc->createElement("para");
$newnode = $doc->appendChild($node);
echo $doc->saveXML();
?>
Ayrıca Bakınız
- DOMNode::removeChild() - Listeden belirtilen çocuğu siler
- DOMNode::replaceChild() - Bir çocuk düğümü yenisi ile değiştirir
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
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>
