PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

DOMNotation> <DOMNodeList
Last updated: Fri, 18 Jul 2008

view this page in

DOMNodelist::item

(No version information available, might be only in CVS)

DOMNodelist::item — Retrieves a node specified by index

Descrizione

DOMNode DOMNodelist::item ( int $index )

Retrieves a node specified by index within the DOMNodeList object.

Suggerimento

If you need to know the number of nodes in the collection, use the length property of the DOMNodeList object.

Elenco dei parametri

index

Index of the node into the collection.

Valori restituiti

The node at the index th position in the DOMNodeList, or NULL if that is not a valid index.

Esempi

Example #1 Traversing all the entries of the table

<?php

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

$items $doc->getElementsByTagName('entry');

for (
$i 0$i $items->length$i++) {
    echo 
$items->item($i)->nodeValue "\n";
}

?>

Alternatively, you can use foreach, which is a much more convenient way:

<?php

foreach ($items as $item) {
    echo 
$item->nodeValue "\n";
}

?>

Il precedente esempio visualizzerĂ :

Title
Author
Language
ISBN
The Grapes of Wrath
John Steinbeck
en
0140186409
The Pearl
John Steinbeck
en
014017737X
Samarcande
Amine Maalouf
fr
2253051209



DOMNotation> <DOMNodeList
Last updated: Fri, 18 Jul 2008
 
add a note add a note User Contributed Notes
DOMNodelist::item
olivier dot berger at it-sudparis dot eu
21-Aug-2008 02:56
It seems that with zend.ze1_compatibility_mode on, the only way to iterate over the items list is with :
for ($i = 0; $i < $nodeList->length; ++$i) {
    $nodeName = $nodeList->item($i)->nodeName;
    $nodeValue = $nodeList->item($i)->nodeValue;
}

As other attemps failed :

for ($i = 0; $i < $nodeList->length; ++$i) {
    $node = &$nodeList->item($i);
    $nodeName = $node->nodeName;
    $nodeValue = $node->nodeValue;
}

or :
foreach ($nodeList as $node) {
    echo $node->nodeName;
    echo $node->nodeValue;
}
vinyanov at poczta dot onet dot pl
05-Jan-2008 10:12
SimpleXML has its own SPL iterator. See http://www.php.net/~helly/php/ext/spl/classSimpleXMLIterator.html . But I guess that there are none for DOM nodes. By the way, two out of three implementations I found over the Net were not recursive, so I wrote my own. Here is the snippet:

<?php

class DOMNodeListIterator implements RecursiveIterator
{
    private
       
$nodes,
       
$offset;

    function
__construct(DOMNodeList $nodes)
    {
        return
$this -> nodes = $nodes;
    }
   
    function
rewind()
    {
        return
$this -> offset = 0;
    }
   
    function
current()
    {
        return
$this -> nodes -> item($this -> offset);
    }

    function
key()
    {
        return
$this -> current() -> nodeName;
    }
   
    function
next()
    {
        return
$this -> offset++;
    }
   
    function
valid()
    {
        return
$this -> offset < $this -> nodes -> length;
    }
   
    function
hasChildren()
    {
        return isset(
$this -> current() -> childNodes -> length) && $this -> current() -> childNodes -> length > 0;
    }
   
    function
getChildren()
    {
        return new
self($this -> current() -> childNodes);
    }
}

?>

Remember to use RecursiveIteratorIterator::SELF_FIRST flag when you create your iterator iterator.

<?php

$iterator
= new DOMNodeListIterator($document -> childNodes);
$iterator = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::SELF_FIRST);

?>

Should work, has just few minutes though. :)
Hayley Watson
29-Oct-2007 03:14
Keep in mind that DOMNodelists are "live" - changes to the document or node that the DOMNodelist was derived from will be reflected in the DOMNodelist. In other words, a list of a parent node's children will change if you change the parent's children!
james dot dunmore at gmai dot com
27-Jul-2007 08:57
tfg_allardyce at gmail dot com

I have had exactly this problem.

To rectify I've had to do this:
<?php
$old_element
= $doc->getElementsByTagName('Element1')->item(0);
$new_element = $doc->createElement('NewElement1');

$old_element_childNodes = $old_element->childNodes;
$length = $old_element_childNodes->length;

for(
$i = 0; $i < $length; $i++)
{       
   
$oldChildren_array[] = $old_element_childNodes->item($i);
}

foreach(
$oldChildren_array as $old_c)
{
   
$new_element->appendChild($old_c);
}
?>

Rather than this:
(which I will bug report)
<?php
$old_element
= $doc->getElementsByTagName('Element1')->item(0):
$new_element = $doc->createElement('NewElement1');

foreach(
$old_element->childNode as $node)
{
    
$new_element->appendChild($node);
}

?>

Using the latter, randomally removes the children!
Geoffrey Thubron
26-May-2007 02:47
@ tfg_allardyce at gmail dot com

You could loop through the list backwards, that way, you are only ever taking off the last item from the list, and hence wont have disrupted the order.
oliver dot christen at camptocamp dot com
13-Feb-2007 07:27
NodeList are something annoying because you can't output the content with a simple print_r, so I did a little function that add all the node to a new empty DOMDocument and output it as a string.
Have fun.

<?php

public function domNodeList_to_string($DomNodeList) {
   
$output = '';
   
$doc = new DOMDocument;
    while (
$node = $DomNodeList->item($i) ) {
       
// import node
       
$domNode = $doc->importNode($node, true);
       
// append node
       
$doc->appendChild($domNode);
       
$i++;
    }
   
$output = $doc->saveXML();
   
$output = print_r($output, 1);
   
// I added this because xml output and ajax do not like each others
   
$output = htmlspecialchars($output);
    return
$output;
}

?>
tfg_allardyce at gmail dot com
10-Jan-2007 03:57
Be careful when looping through a DOMNodeList and moving its nodes around, sometimes this will take that node off the DOMNodeList and sometimes it wont!

<?php
// let $nodes be node list and $parent be some other node

foreach($nodes as $node) {
  
$parent->appendChild($node);
}

?>

In some cases the $node will be taken off the list and the next iteration of the loop will be corrupted, skipping every other node in the list! In other cases the node will remain in the list and everything will be fine.

Generally if you've created the node list using a getElementsByTagName call or an XPath query then the nodes will stay on the list. If the node list comes from another nodes' childNodes property those child nodes will be shifted off the list whenever you call appendChild.

DOMNotation> <DOMNodeList
Last updated: Fri, 18 Jul 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites