simplexmlelement simplexml_load_file new leer lectura ejemplo con atributos array php simplexml

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?



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...



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).