attributes()
Aprende a leer, iterar, modificar, añadir y eliminar atributos XML con PHP SimpleXML, incluyendo el método attributes() y atributos con espacio de nombres.
Introducción
En XML, un atributo es un par nombre/valor adjunto a la etiqueta de apertura de un elemento, como el isbn en <book isbn="123456789">. PHP SimpleXML expone esos atributos a través de una pequeña API similar a un array, para que puedas leerlos, cambiarlos, añadirlos y eliminarlos sin tener que analizar el XML manualmente.
Esta página cubre cuatro tareas habituales: leer un único atributo, iterar sobre todos ellos con attributes(), modificar valores y añadir nuevos atributos, además de dos aspectos que suelen causar confusión: la conversión de tipos y los atributos con espacio de nombres.
Leer un único atributo
Trata el elemento como un array e índexalo por el nombre del atributo:
Hay un error común que hay que tener en cuenta: $xml['isbn'] no es un string plano — es un SimpleXMLElement. Se imprime correctamente porque se convierte al vuelo, pero si lo comparas estrictamente (===) o lo almacenas para más tarde, conviértelo primero:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
$isbn = (string) $xml['isbn']; // cast to a real string
var_dump($isbn === '123456789');
// bool(true)Usa isset() para comprobar si un atributo existe antes de leerlo:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
echo isset($xml['isbn']) ? "has isbn\n" : "no isbn\n";
echo isset($xml['lang']) ? "has lang\n" : "no lang\n";
// has isbn
// no langListar todos los atributos con attributes()
Cuando no conoces los nombres de los atributos de antemano, llama al método attributes(). Devuelve un SimpleXMLElement sobre el que puedes iterar, con el nombre del atributo como clave y su valor como valor:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"><title>PHP Basics</title></book>');
foreach ($xml->attributes() as $name => $value) {
echo "$name = $value\n";
}
// isbn = 123456789
// lang = enDado que el resultado es contable, también puedes obtener el número de atributos:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2Modificar valores de atributos
Para cambiar un atributo, asigna un nuevo valor mediante la sintaxis de array y luego serializa con asXML():
Añadir atributos
Un nuevo elemento creado con simplexml_load_string() o new SimpleXMLElement() puede no tener el atributo que necesitas. Añade uno con addAttribute(), pasando el nombre y el valor:
Ten en cuenta que asignar a un atributo que aún no existe ($xml['isbn'] = '...') también lo crea, pero addAttribute() es la única forma de añadir un atributo con espacio de nombres.
Eliminar un atributo
No existe un método dedicado a "eliminar". Usa unset() para eliminar el atributo:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
unset($xml['lang']);
echo $xml->asXML();
// <?xml version="1.0"?>
// <book isbn="123456789"/>Atributos con espacio de nombres
Los atributos que pertenecen a un espacio de nombres XML (por ejemplo, meta:rating) están ocultos en una llamada simple a attributes(). Pasa el URI del espacio de nombres para leerlos:
<?php
$xml = new SimpleXMLElement(
'<book xmlns:meta="http://example.com/meta" meta:rating="5"><title>PHP Basics</title></book>'
);
foreach ($xml->attributes('http://example.com/meta') as $name => $value) {
echo "$name = $value\n";
}
// rating = 5Resumen
- Lee un único atributo con sintaxis de array:
$xml['isbn']. Conviértelo a(string)para comparaciones estrictas. - Itera sobre todos los atributos con
attributes(); el resultado es iterable y contable. - Asigna un nuevo valor para modificar, usa
addAttribute()para añadir yunset()para eliminar. - Pasa un URI de espacio de nombres a
attributes()para acceder a atributos con espacio de nombres.
Para profundizar más, consulta Descripción general de SimpleXML, simplexml_load_string() y Análisis de XML con SimpleXML.