PHP的SimpleXML检查是否存在一个孩子

A->b->c可能存在,但c可能不存在。 我如何检查它?

 if($A->b->c != null) //c exists 

如果c不存在,它的值将为null (或者更确切地说,它将没有值)。 但是,请注意,为此, Ab都不能为null 。 否则,PHP会抛出一个错误(我认为)。

将它包装在isset()可能会更好一些

 if(isset($A->b->c)) { // c exists 

这样,如果$A$A->b不存在…它不会炸毁。

SimpleXML总是返回Object。 如果没有孩子,则返回空对象。

 if( !empty($a->b)){ var_dump($a->b); } 

我通过使用children()函数并对其执行count()解决此问题,如果在计数调用之前放置了@,而没有孩子,则会忽略PHP错误。 这是愚蠢的,但它的工作原理:

 $identification = $xml->identification; if (@count($identification->children()) == 0) $identification = $xml->Identification; 

我讨厌这个…

方法xpath返回匹配元素的数组或false

 if(false !== $A->xpath('b/c')) { ... 

http://www.php.net/manual/ru/simplexmlelement.xpath.php

经过一番实验,我发现检查节点是否存在的唯一可靠方法是使用count($xml->someNode)

这是一个testing用例: https : //gist.github.com/Thinkscape/6262156

如果你有PHP 5.3,你可以使用$a->count() 。 否则,使用@count($a->children()) scippie解决scheme效果很好。 我发现我不需要@,但更旧的PHP实现可能需要它。

使用if(isset($A->b){给我的问题,所以我试图if($A->b){和它的工作!

只是

 var_dump(count($xml->node)); 

你可以尝试:

 if($A->b->c && $A->b->c != '') 

以为我会分享我的经验。 在5.4上运行,我尝试了'isset'和'empty'的testing,但都没有为我工作。 我结束了使用is_null

 if(!is_null($xml->scheduler->outterList->innerList)) { //do something } 

名称空间

请注意,如果您在XML文件中使用名称空间,则在检查孩子时,您需要在函数调用中包含这些名称空间,否则每次都会返回ZERO:

 if ($XMLelement->children($nameSpace,TRUE)->count()){ //do something here } 

我可以确认在PHP 5.5.23工作的3种方法是使用isset() count()empty()

这是一个脚本来显示每个结果:

https://gist.github.com/mchelen/306f4f31f21c02cb0c24

使用xpath:

 function has_child(\SimpleXMLElement $parent=null, string $xpathToChild) { return isset($parent) && !empty($parent->xpath('('.$xpathToChild.')[1]')); } 

其中$parent是要检查的子节点的间接或直接父节点, $xpathToChild是相对于$parent的子节点的xpath。

()[1]是因为我们不想select所有的子节点。 一个就足够了。

检查$ a-> b-> c是否存在:

has_child($a,'b/c');has_child($a->b,'c');

您也可以检查属性。 检查节点c是否具有t属性。

 has_child($a,'b/c/@t');