DOMNode->removeChild()

(no version information, might be only in CVS)

DOMNode->removeChild() --  Removes child from list of children

Описание

class DOMNode {

DOMNode removeChild ( DOMNode oldnode )

}

This functions removes a child from a list of children.

Список параметров

oldnode

The removed child.

Возвращаемые значения

If the child could be removed the functions returns the old child.

Исключения

DOM_NO_MODIFICATION_ALLOWED_ERR

Raised if this node is readonly.

DOM_NOT_FOUND

Raised if oldnode is not a child of this node.

Примеры

The following example will delete the chapter element of our XML document.

Пример 1. Removing a child

<?php

$doc
= new DOMDocument;
$doc->load('book.xml');

$book = $doc->documentElement;

// we retrieve the chapter and remove it from the book
$chapter = $book->getElementsByTagName('chapter')->item(0);
$oldchapter = $book->removeChild($chapter);

echo
$doc->saveXML();
?>

Результат выполнения данного примера:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" 
          "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">
<book id="listing">
 <title>My lists</title>
 
</book>



DOMNode->removeChild()
mytto at openxtrem dot com
07-Sep-2005 02:20
Back again on removing childs and iterators robustness.

Things get a bit more complicated when you only want to remove 'some' nodes according to a certain condition. Then you can't just remove the first one repeatedly.

The trick is to copy the content of the node list into a more robust collection than DOMNodeList, I name array!

The following piece of code will, for instance, remove all empty child nodes:

<?php
// Copy childNodes array
$childNodes = array();
foreach(
$node->childNodes as $childNode) {
 
$childNodes[] = $childNode;
}

// Browse with the copy   
foreach ($childNodes as $childNode) {
  if (!
$childNode->hasChildNodes()); {
  
$childNode->parentNode->removeChild($childNode);
  }
}
?>
karan
28-Aug-2005 02:48
can we directly remove a node which has some children or do we need to remove the children first.

 while($mytn->hasChildNodes())
   {
     $mytn->removeChild($mytn->childNodes->item(0));
   }

echo $j;//this shows correct no of children

echo $mytn->childNodes->length;//after removing it
                                         // shows 0..correct
  
$dom->save(net.xml);

but the changes r not reflected in the xml file
blaine (at) blainegarrett (dot com)
23-Aug-2005 10:10
This might be obvious, but might help someone as well...

If you simply have a node that you need to remove (perhaps from an xpath) and don't know the parent node offhand (the examples seem to assume you have the parent in a variable), then you can do something easy like this...

$node->parentNode->removeChild($node);

parentNode is a scalar property of the Element.

Hope that helps.

--
Blaine Garrett
Executive Director of the Art Attack
http://theartattack.org
pedro at leb dot usp dot br
30-May-2005 04:24
You may also use the hasChild function:
<?php

while($node->hasChildNodes()) {
 
$node->removeChild($node->childNodes->item(0));
}

?>

When you remove a childNode, the next node becomes the first one!
vsematika at centrum dot cz
13-Feb-2005 03:35
For those who don't understand >sbeam at onsetcorps dot net on 02-Feb-2005 12:07< 'hack', here's a little discussion:

First but *wrong* try would be:
<?php
foreach ($parent->childNodes as $child) {
  
$parent->removeChild($child);
?>
This doesn't work because DOM tree id modified on-the-fly and this confuses foreach loop.

The idea behind sbeam's trick is that after removing the first item in the first iteration, the second item in childNodes nodelist immediately becomes the first item. That's why we must _always_ remove the first child. Here's another implementation:

<?php
$count
= $parent->childNodes->length;
for (
$i = 0; $i < $count; $i++) {
  
$oldNode = $parent->removeChild($parent->childNodes->item(0)); // !!! not item($i) !!!
}
?>
sbeam at onsetcorps dot net
02-Feb-2005 09:07
remove all children of a given node:
      
while ($parent->childNodes->length) {
     $parent->removeChild($parent->childNodes->item(0));
}

<DOMNode->normalize()DOMNode->replaceChild()>
 Last updated: Tue, 15 Nov 2005