attributes()
Scopri come leggere, iterare, modificare, aggiungere e rimuovere attributi XML con PHP SimpleXML — incluso il metodo attributes() e gli attributi con namespace.
Introduzione
In XML, un attributo è una coppia nome/valore associata al tag di apertura di un elemento, come isbn in <book isbn="123456789">. PHP SimpleXML espone questi attributi tramite una piccola API simile a un array, così puoi leggerli, modificarli, aggiungerli e rimuoverli senza dover analizzare l'XML manualmente.
Questa pagina tratta quattro operazioni quotidiane — leggere un singolo attributo, iterare su tutti con attributes(), modificare valori e aggiungere nuovi attributi — oltre a due aspetti che creano problemi: il cast dei tipi e gli attributi con namespace.
Leggere un singolo attributo
Tratta l'elemento come un array e indicizza per nome dell'attributo:
C'è un'insidia comune: $xml['isbn'] non è una string normale — è un SimpleXMLElement. Viene stampato correttamente perché viene convertito al volo, ma se lo confronti con === (confronto stretto) o lo salvi per dopo, esegui prima il cast:
<?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() per verificare se un attributo esiste prima di leggerlo:
<?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 langElencare tutti gli attributi con attributes()
Quando non conosci in anticipo i nomi degli attributi, chiama il metodo attributes(). Restituisce un SimpleXMLElement su cui puoi iterare, con il nome dell'attributo come chiave e il suo valore come valore:
<?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 = enPoiché il risultato è contabile, puoi anche ottenere il numero di attributi:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2Modificare i valori degli attributi
Per cambiare un attributo, assegna un nuovo valore tramite la sintassi array, poi serializza con asXML():
Aggiungere attributi
Un nuovo elemento creato con simplexml_load_string() o new SimpleXMLElement() potrebbe non avere l'attributo di cui hai bisogno. Aggiungine uno con addAttribute(), passando nome e valore:
Nota che assegnare a un attributo che non esiste ancora ($xml['isbn'] = '...') lo crea comunque — ma addAttribute() è l'unico modo per aggiungere un attributo con namespace.
Rimuovere un attributo
Non esiste un metodo dedicato alla rimozione. Elimina l'attributo con unset():
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
unset($xml['lang']);
echo $xml->asXML();
// <?xml version="1.0"?>
// <book isbn="123456789"/>Attributi con namespace
Gli attributi che appartengono a un namespace XML (ad esempio meta:rating) sono nascosti da una normale chiamata a attributes(). Passa l'URI del namespace per leggerli:
<?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 = 5Riepilogo
- Leggi un singolo attributo con la sintassi array:
$xml['isbn']. Esegui il cast a(string)per confronti stretti. - Itera su tutti gli attributi con
attributes(); il risultato è iterabile e contabile. - Assegna un nuovo valore per modificare, usa
addAttribute()per aggiungere eunset()per rimuovere. - Passa un URI di namespace a
attributes()per accedere agli attributi con namespace.
Per approfondire, consulta la panoramica di SimpleXML, simplexml_load_string() e analisi di XML con SimpleXML.