PHP的SimpleXML检查是否存在一个孩子
A->b->c
可能存在,但c
可能不存在。 我如何检查它?
if($A->b->c != null) //c exists
如果c
不存在,它的值将为null
(或者更确切地说,它将没有值)。 但是,请注意,为此, A
和b
都不能为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')) { ...
经过一番实验,我发现检查节点是否存在的唯一可靠方法是使用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()
这是一个脚本来显示每个结果:
使用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');