PHP Doku:: Returns children of node - function.domnode-child-nodes.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:

Ein Service von Reinhard Neidl - Webprogrammierung.





(PHP 4 >= 4.1.0)

DomNode->child_nodes Returns children of node


array DomNode->child_nodes ( void )

Returns all children of the node.

See also domnode_next_sibling(), and domnode_previous_sibling().

9 BenutzerBeiträge:
- Beiträge aktualisieren...
thibo1025 at hotmail dot fr
30.04.2008 11:57
to avoid the "#text" what you can simply do without changing your xml file, is:

if($item->nodeName != "#text"){
// do your code.
andrew at transitionkiteboarding dot com
26.05.2004 20:58
Sometimes unless you know exactly where elements are it can be time consuming to pick each thing up with get_element_by_tagname calls.

I used a quick little function that, given a structure such as:


it will return an associative array with the tag names as keys and the content as values. During the load I strip whitespace as well so it isn't confused by \n's creating blank nodes

-- CODE --
$xmldoc = domxml_open_mem($xmlstring,

  // get the node root and then the children of it.
  $noderoot = $xmldoc->document_element();
  $childnodes = $noderoot->child_nodes();

  // build the array
  foreach ($childnodes as $value) {
      echo $value->tagname . " : " . $value->get_content() . "<br>";
      $nodeArray[$value->tagname] = $value->get_content();

-- END CODE --

You can then return node array or start using it however you like in other functions just like a normal associative array then.

$nodeArray['firstname'] == "Joe"
grillen at abendstille dot at
25.01.2004 22:08
There were some comments about problems with whitespaces.
you can easily solve them by creating the dom-document as follows:

= @domxml_open_mem(
,    $error

if you call child_nodes() on eg. the root-element whitespaces are ignored.
5.11.2003 2:17
Here is a handy little function i started using at work and home quite a bit. It takes in an array of nodes, typically from DomNode->child_nodes() as well as a filter argument and returns an array of filtered out nodes.

If the $filter arg is a string, then the $boolean argument is used. If boolean is true, then only nodes named $filter will be returned. If boolean is false, then only nodes NOT named $filter will be returend.

Additionally, you can specify the filter as an assoc array in the form of $array[$node_name] = true|false and only nodes in the array with a true value are returend. Note that if it is an array, then $boolean is not used. I was planning on having the boolean act as a negation kinda like !in_array(), but it was more for completeness than need so i dropped it.

function get_filtered_children($children_array,$filter,$boolean = true){
    $total_children = count($children_array);
    for ($i = 0; $i < $total_children; $i++){
        $cur_child = $children_array[$i];
        $node_name = $cur_child->node_name();
        if (is_array($filter)){ //array in the form of [node_name] = true|false
            if ($filter[$node_name])
                $filtered_children_array[] = $cur_child;
        else if(is_string($filter)){ //string hopefully...
            if ($boolean && $node_name == $filter)
                $filtered_children_array[] = $cur_child;
            elseif (!$boolean && $node_name != $filter)
                $filtered_children_array[] = $cur_child;
            user_error('filter is of type ' . gettype($filter) . '. Please only supply arrays or strings.', E_USER_ERROR);
    return $filtered_children_array;

Blaine Garrett
Web Master of the Art Attack
arcana at yetta dot net
10.03.2003 2:32
A better way to check for Text Child nodes (PHP 4.3.0)

    if ($childnode->node_type() == XML_TEXT_NODE)
        echo "<br/>This item is a text node.";
        echo "<br/>This item is not a text node.";

You may want to look at DomElement->is_blank_node() as well.
30.12.2002 19:34
Loop through children making sure that the children are not text nodes.

$moduleDoc = domxml_open_file("main_module_defs.xml");
$moduleDefinitionXPath = xpath_new_context($moduleDoc);
$dConvsNodeSet = xpath_eval($moduleDefinitionXPath, "//modules/module[@name='search']/dConvs");
$children = $dConvsNodeSet->nodeset[0]-> child_nodes();
$dTotal = count($children);
for ($i=0;$i<$dTotal;$i++){
    $curNode = $children[$i];
    if($curNode->node_name() != "#text"){
        echo "This are probably TextNodes...";    }

11.09.2002 1:54
To answer hrosas)at(linuxmail)dot(org.


<node> has 3 children.
1. whitespace between <node> and <child/>
2. <child/>
3. whitespace between <child/> and </node>

The whitespace is treated like text. To avoid this remove all whitespace.


This can get hard to read, but correct.

But, you can tell some programs to ignore the whitespace, so it remains easy to read.

Jon Sprague
28.08.2002 3:36
I was using child_nodes and if I have a node like this.

the node <node> have two children: one the "    " spaces that appear as #text on php and <child/>. Is that normal? I think node has just one child <child/>
j dot metzger at steptown dot com
26.08.2002 17:01
if no children present, method
FALSE (bool)

you can check the return result like this:

$children = $domNode -> child_nodes();
if (is_bool($children))
   print "Sorry, no children present ...";

PHP Powered Diese Seite bei
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)