• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • DOMNode::hasChildNodes()

    (PHP 5, PHP 7)

    Checks if node has children

    说明

    publicDOMNode::hasChildNodes(void): bool

    This function checks if the node has children.

    返回值

    成功时返回TRUE,或者在失败时返回FALSE

    参见

    • DOMNode::hasAttributes() Checks if node has attributes
    Personally I think using a simple:[code]if($DOMNode->childNodes <>0){}[/code] works better.
    This "hasChildNodes()" exercise is simple enough to make it clear and understandable. Or, you could take it as a tag empty check. By Richard Holm, Sweden.
    <?php
    $xmldoc=
    '<?xml version="1.0" ?>
    <root>
    <text>Text</text>
    <none/>
    <empty></empty>
    <space> </space>
    </root>';
    $domdoc=new DOMDocument();
    $domdoc->loadXML($xmldoc);
    $tag=$domdoc->getElementsByTagName('root')->item(0);
    $v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
    echo $tag->tagName.$v."<br/>";
    $tag=$domdoc->getElementsByTagName('text')->item(0);
    $v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
    echo $tag->tagName.$v."<br/>";
    $tag=$domdoc->getElementsByTagName('none')->item(0);
    $v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
    echo $tag->tagName.$v."<br/>";
    $tag=$domdoc->getElementsByTagName('empty')->item(0);
    $v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
    echo $tag->tagName.$v."<br/>";
    $tag=$domdoc->getElementsByTagName('space')->item(0);
    $v=$tag->hasChildNodes()?" hasChildNodes":" hasNoChildNodes";
    echo $tag->tagName.$v."<br/>";
    ?>
    Output:
    root hasChildNodes
    text hasChildNodes
    none hasNoChildNodes
    empty hasNoChildNodes
    space hasChildNodes
    This function is a bit tricky. If you want to find XML childnodes it is useless. You need to create a work-around:
    <?php
    $x = new DOMDocument();
    $x->loadXML('
    <A>
     <B>b-text</B>
     <C>
     <D>d-text</D>
     </C>
     <E/>
    </A>');
    shownode($x->getElementsByTagName('A')->item(0));
    function shownode($x) {
     foreach ($x->childNodes as $p)
     if (hasChild($p)) {
       echo $p->nodeName.' -> CHILDNODES<br>';
       shownode($p);
     } elseif ($p->nodeType == XML_ELEMENT_NODE)
      echo $p->nodeName.' '.$p->nodeValue.'<br>';
    }
    function hasChild($p) {
     if ($p->hasChildNodes()) {
     foreach ($p->childNodes as $c) {
      if ($c->nodeType == XML_ELEMENT_NODE)
      return true;
     }
     }
     return false;
    }
    ?>
    shows:
    B b-text
    C -> CHILDNODES
    D d-text
    E
    Hi what if its a dynamic file and we cannot use get elements by tag name then how do we print the contents of all level tags?
    <?php
    $doc = new DOMDocument;
    $node = $doc->createElement("FirstMain", "First Main Node. This have child");
    $doc->appendChild($node);
    $childnode = $doc->createElement("childnode", "child node");
    $node->appendChild($childnode);
    $secondnode = $doc->createElement("SecondMain", "First Main Node. This don't have child");
    $doc->appendChild($secondnode);
    $doc->saveXML();
    $nodeElmt = $doc->getElementsByTagName("FirstMain");
    /*
    if given as $nodeElmt = $doc->getElementsByTagName("childnode");
    the output would be "This node has childnodes"
    if given as $nodeElmt = $doc->getElementsByTagName("SecondMain");
    the output would be "This node has no childnodes"
    */
    foreach($nodeElmt as $nodeElmt)
    {
    if($nodeElmt->hasChildNodes())
    {
    echo "This node has childnodes";
    }
    else
    {
    echo "This node has no childnodes";
    }
    }
     ?>
    - - - - - - - - - - - - - -
    Output:
    This node has childnodes
    - - - - - - - - - - - - - -