addAttribute()
Aprende a usar SimpleXMLElement::addAttribute() en PHP para añadir atributos a elementos XML, incluyendo soporte de espacios de nombres.
Introducción
SimpleXML es una extensión de PHP que proporciona una API simple y fácil de usar para trabajar con documentos XML. La función SimpleXMLElement::addAttribute() es una de las muchas funciones que SimpleXML ofrece para trabajar con documentos XML. Es una herramienta potente que se puede usar para añadir atributos a un elemento en un documento XML. En este artículo, analizaremos en detalle la función SimpleXMLElement::addAttribute() y cómo puede utilizarse en PHP.
Sintaxis
addAttribute() es un método de un objeto SimpleXMLElement. Añade un atributo al elemento sobre el que se llama y no devuelve nada (void):
public SimpleXMLElement::addAttribute(
string $name,
string $value = "",
?string $namespace = null
): void| Parámetro | Requerido | Descripción |
|---|---|---|
$name | Sí | El nombre del atributo a añadir (por ejemplo, id o xml:lang). |
$value | No | El valor del atributo. Por defecto, una cadena vacía. |
$namespace | No | El URI del espacio de nombres al que pertenece el atributo. Omítelo para un atributo simple sin espacio de nombres. |
Como muta el elemento en su lugar, no necesitas asignar el resultado a nada: el nuevo atributo simplemente aparece en el elemento después de la llamada.
Ejemplo básico
El uso más común es añadir uno o más atributos a un elemento recién creado:
Esto crea un elemento <book>, le añade un atributo isbn, luego agrega dos elementos hijo antes de serializar el documento a una cadena con asXML(). La salida es:
<?xml version="1.0"?>
<book isbn="123456789"><title>PHP Basics</title><author>John Doe</author></book>¿Por qué usar addAttribute() en lugar de la sintaxis de array?
SimpleXML permite leer atributos con sintaxis de array — $element['isbn'] — e incluso escribirlos de esa forma. Entonces, ¿por qué existe addAttribute()?
- Es la forma documentada de crear un atributo. La sintaxis de escritura con array funciona para cambiar un valor que ya existe, pero
addAttribute()es explícita sobre la adición de uno nuevo. - Soporta espacios de nombres. La sintaxis de array no puede adjuntar un espacio de nombres al atributo que establece; el tercer parámetro de
addAttribute()sí puede hacerlo.
<?php
$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
// Update an existing attribute (array syntax is fine here):
$xml['isbn'] = '000000000';
// Add a brand-new attribute:
$xml->addAttribute('language', 'en');
echo $xml->asXML();Añadir un atributo con espacio de nombres
Cuando un documento usa espacios de nombres XML, pasa el URI del espacio de nombres como tercer argumento. El nombre del atributo debe incluir el prefijo al que deseas vincularlo:
<?php
$xml = new SimpleXMLElement('<book></book>');
$xml->addAttribute('xml:lang', 'en', 'http://www.w3.org/XML/1998/namespace');
echo $xml->asXML();Esto produce <book xml:lang="en"/>. Sin el argumento de espacio de nombres, el : en el nombre se trataría como parte literal del nombre del atributo en lugar de un prefijo de espacio de nombres.
Errores comunes
- No sobreescribe. Llamar a
addAttribute()con un nombre que ya existe añade un segundo atributo con ese nombre, produciendo XML no válido. Para cambiar un valor existente, usa la sintaxis de escritura con array ($xml['isbn'] = '...') en su lugar. - Los caracteres especiales se escapan automáticamente. Valores como
Tom & Jerryse codifican automáticamente comoTom & Jerryen la salida, por lo que no necesitas escaparlos tú mismo. - El orden importa con los espacios de nombres. Añade atributos con espacio de nombres después de que el elemento exista; no puedes asignar un espacio de nombres a un atributo en un elemento que no está dentro del ámbito de ese espacio de nombres sin declararlo.
<?php
$xml = new SimpleXMLElement('<book></book>');
$xml->addAttribute('isbn', '123 & 456');
echo $xml->asXML(); // <book isbn="123 & 456"/>Funciones relacionadas
addChild()— añade un elemento hijo en lugar de un atributo.asXML()— serializa el SimpleXMLElement de vuelta a una cadena XML.attributes()— lee los atributos que ya tiene un elemento.
Conclusión
SimpleXMLElement::addAttribute() es la forma explícita y compatible con espacios de nombres de añadir atributos al construir XML con SimpleXML. Úsala cuando crees atributos (especialmente los que tienen espacio de nombres), y emplea la sintaxis de escritura con array cuando solo necesites actualizar un valor ya existente. Ten en cuenta que nunca sobreescribe y que escapa los caracteres especiales automáticamente.