simplexml_load_file - php SimpleXML comprueba si existe un hijo
simplexmlelement php ejemplo (15)
Después de algunos experimentos, descubrí que el único método confiable para verificar si un nodo existe es usar count($xml->someNode)
.
Aquí hay un caso de prueba: https://gist.github.com/Thinkscape/6262156
A->b->c
podría existir pero c
podría no existir. ¿Cómo lo verifico?
Las 3 formas en que puedo confirmar el trabajo en PHP 5.5.23 estaban usando isset()
count()
o empty()
Aquí hay un script para mostrar los resultados de cada uno:
Lo resolví utilizando la función children()
y haciendo un count()
en él, ignorando un error de PHP si no hay hijos al poner un @ antes de la llamada de conteo. Esto es estúpido, pero funciona:
$identification = $xml->identification;
if (@count($identification->children()) == 0)
$identification = $xml->Identification;
Odio esto...
Método xpath devuelve una matriz de elementos coincidentes o falsa
if(false !== $A->xpath(''b/c'')) { ...
Nombre Espacios
Tenga en cuenta que si utiliza espacios de nombres en su archivo XML, deberá incluirlos en sus llamadas a funciones cuando busque niños, de lo contrario, devolverá CERO cada vez:
if ($XMLelement->children($nameSpace,TRUE)->count()){
//do something here
}
Pensé que compartiría mi experiencia. Correr en 5.4 intenté probar con ''isset'' y ''empty'', pero ninguno funcionó para mí. Terminé usando is_null .
if(!is_null($xml->scheduler->outterList->innerList)) {
//do something
}
Sería mejor incluir esto en un isset()
if(isset($A->b->c)) { // c exists
De esa forma si $A
o $A->b
no existen ... no explota.
Si tiene PHP 5.3, puede usar $a->count()
. De lo contrario, la solución de @count($a->children())
usando @count($a->children())
funciona bien. Encuentro que no necesito el @ pero las implementaciones antiguas de PHP pueden necesitarlo.
SimpleXML siempre devuelve Object. Si no hay un hijo, se devuelve el objeto vacío.
if( !empty($a->b)){
var_dump($a->b);
}
Simplemente
var_dump(count($xml->node));
Tu podrías intentar:
if($A->b->c && $A->b->c != '''')
Usando if(isset($A->b){
me dio problemas, así que probé if($A->b){
y funcionó!
Usando xpath:
function has_child(/SimpleXMLElement $parent=null, string $xpathToChild)
{
return isset($parent) && !empty($parent->xpath(''(''.$xpathToChild.'')[1]''));
}
donde $parent
es un $parent
indirecto o directo del nodo hijo para verificar y $xpathToChild
es un xpath para el hijo en relación con $parent
.
()[1]
es porque no queremos seleccionar todos los nodos secundarios. Uno es suficiente.
Para verificar si $ a-> b-> c existe:
has_child($a,''b/c'');
o has_child($a->b,''c'');
También puede verificar los atributos. Para verificar si el nodo c
tiene el atributo t
.
has_child($a,''b/c/@t'');
Uso una función auxiliar para verificar si un nodo es un nodo válido proporcionado como un parámetro en la función.
private static function isValidNode($node) {
return isset($node) && $node instanceof SimpleXMLElement && !empty($node);
}
Ejemplo de uso:
public function getIdFromNode($node) {
if (!self::isValidNode($node)) {
return 0;
}
return (int)$node[''id''];
}
if($A->b->c != null) //c exists
Si c
no existe, su valor será null
(o, para ser más precisos, no tendrá valor). Sin embargo, tenga en cuenta que para que esto funcione, tanto A
como b
no deben ser null
. De lo contrario, PHP arrojará un error (creo).