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 5, PHP 7, PHP 8)
DOMNode::hasChildNodes — Checks if node has children
This function checks if the node has children.
此函数没有参数。
成功时返回 true
, 或者在失败时返回 false
。
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?
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
Personally I think using a simple:[code]if($DOMNode->childNodes <>0){}[/code] works better.
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
<?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
- - - - - - - - - - - - - -