Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找XML节点是否有子节点_Php_Xml - Fatal编程技术网

Php 查找XML节点是否有子节点

Php 查找XML节点是否有子节点,php,xml,Php,Xml,我目前正在编写一个处理XML文档的PHP类。具体地说,此类的某个方法需要知道节点是否有子节点或是否是“叶”。假设XML结构如下所示: <root> <obj1> <obj2>red</obj1> <obj3>green</obj3> <obj4> <obj5></obj5> </

我目前正在编写一个处理XML文档的PHP类。具体地说,此类的某个方法需要知道节点是否有子节点或是否是“叶”。假设XML结构如下所示:

<root>
    <obj1>
         <obj2>red</obj1>
         <obj3>green</obj3>
         <obj4>
             <obj5></obj5>
         </obj4>
    </obj1>
</root>
然而,对于我应用它的任何对象,无论它是否有子节点,这样的代码都会返回“true”

我做错了什么

$node = $MyDoc->getElementsByTagName($node_name);
foreach($node as $node)
您正在覆盖您的变量。尝试:

$nodelist = $MyDoc->getElementsByTagName($node_name);
foreach($nodelist as $node)

我将根、Obj1和Obj4作为节点,而Obj2、Obj3和Obj5是叶子,没有子节点本身。

你错了。DOM树是节点的层次结构。这意味着DOMText、DOMElements、DOMDocument等都继承自DOMNode。请再看一遍以理解这个概念

以下是文档的树层次结构:

root
    #text
    obj1
        #text
        obj2
            #text
        #text
        obj3
            #text
        #text
        obj4
            #text
            obj5
            #text
        #text
    #text
在你提到的那些中,只有obj5是一片叶子。因此:

var_dump($dom->getElementsByTagName('obj5')->item(0)->hasChildNodes()); // false
不能使用任何DOMNode方法仅计算DOMELENT节点(除非您希望迭代每个子节点并检查其节点类型)。但您可以使用XPath:

$dom = new DOMDocument;
$dom->loadXML($xml);
$xp = new DOMXPath($dom);
var_dump( $xp->evaluate('count(/root/obj1/obj2/*)') ); // 0

<> >代码> */COD>只考虑DOM(VS使用代码> NoDE())/代码>考虑所有节点。

尝试,没有改变…此外,手册的第二个例子覆盖了foreach循环中的变量。是的,你是对的。虽然这是用户输入,但是这篇文章应该被控制。我经常使用手册中的代码-你试过了吗?甚至连看都不看?我怀疑您忘记在DOMDocument上添加->加载,或者这是在NewDOMDocument函数中处理的?以及$node_name的声明?或者您的意思是创建一个DOMDocument,它应该是
$MyDoc=newDOMDocument();/和加载数据
?不,实际上我的代码中包含了这两个。只是没有把它们贴在这里,因为可能会有几百行代码。。。$node_name和->load都是文档的一部分我的代码有$MyDocument=newDOMDocument(“1.0”);-我的错,打字错误。。
$dom = new DOMDocument;
$dom->loadXML($xml);
$xp = new DOMXPath($dom);
var_dump( $xp->evaluate('count(/root/obj1/obj2/*)') ); // 0