2010-09-05 15 views
7

tengo este objeto de resultado simplexml:Compruebe si existe el nodo XML en PHP

object(SimpleXMLElement)#207 (2) { 
    ["@attributes"]=> 
    array(1) { 
    ["version"]=> 
    string(1) "1" 
    } 
    ["weather"]=> 
    object(SimpleXMLElement)#206 (2) { 
    ["@attributes"]=> 
    array(1) { 
    ["section"]=> 
    string(1) "0" 
    } 
    ["problem_cause"]=> 
    object(SimpleXMLElement)#94 (1) { 
    ["@attributes"]=> 
    array(1) { 
    ["data"]=> 
    string(0) "" 
    } 
    } 
    } 
} 

tengo que comprobar si existe el nodo "problem_cause". Incluso si está vacío, el resultado es un error. En el manual de php, me encontré con este código php que he modificado para mis necesidades:

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    if (count($result)) { 
     return true; 
    } else { 
     return false; 
    } 
} 

if(xml_child_exists($xml, 'THE_PATH')) //error 
{ 
    return false; 
} 
return $xml; 

no tengo idea de qué poner en el lugar de la consulta XPath 'THE_PATH' para comprobar si existe el nodo. ¿O es mejor convertir el objeto simplexml en dom?

Respuesta

27

Parece un simple isset() resuelve este problema.

<?php 
$s = new SimpleXMLElement('<foo version="1"> 
    <weather section="0" /> 
    <problem_cause data="" /> 
</foo>'); 
// var_dump($s) produces the same output as in the question, except for the object id numbers. 
echo isset($s->problem_cause) ? '+' : '-'; 

$s = new SimpleXMLElement('<foo version="1"> 
    <weather section="0" /> 
</foo>'); 
echo isset($s->problem_cause) ? '+' : '-'; 

imprime +- sin ningún mensaje de error/advertencia.

+0

Oh, gracias. Esa es una solución muy fácil. – reggie

+0

Es mejor usar 'empty()' que 'isset()'. El acceso a un elemento secundario del objeto lo creará si no existe, por lo que SimpleXMLElement devolverá un elemento vacío y 'isset()' devolverá verdadero. –

+0

@ MugomaJ.Okomba 'empty()' devuelve verdadero incluso si el nodo existe pero no tiene contenido – CITBL

2

Usando el código que ha publicado, este ejemplo debería funcionar para encontrar el nodo problem_cause en cualquier profundidad.

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    return (bool) (count($result)); 
} 

if(xml_child_exists($xml, '//problem_cause')) 
{ 
    echo 'found'; 
} 
else 
{ 
    echo 'not found'; 
} 
1

probar esto:

function xml_child_exists($xml, $childpath) 
{ 
    $result = $xml->xpath($childpath); 
    if(!empty($result)) 
{ 
    echo 'the node is available'; 
} 
else 
{ 
    echo 'the node is not available'; 
} 
} 

espero que esto le ayudará a ..