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