W3docs

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:

php— editable, runs on the server

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 lang

Listar 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 = en

Dado 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());
// 2

Modificar valores de atributos

Para cambiar un atributo, asigna un nuevo valor mediante la sintaxis de array y luego serializa con asXML():

php— editable, runs on the server

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:

php— editable, runs on the server

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 = 5

Resumen

  • 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 y unset() 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.

Práctica

Práctica
¿Cómo lees todos los atributos de un elemento SimpleXML cuando no conoces sus nombres?
¿Cómo lees todos los atributos de un elemento SimpleXML cuando no conoces sus nombres?
Was this page helpful?