W3docs

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:

php— editable, runs on the server

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 lang

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

Poiché il risultato è contabile, puoi anche ottenere il numero di attributi:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2

Modificare i valori degli attributi

Per cambiare un attributo, assegna un nuovo valore tramite la sintassi array, poi serializza con asXML():

php— editable, runs on the server

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:

php— editable, runs on the server

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 = 5
  • 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 e unset() 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.

Esercitazione

Pratica
Come si leggono tutti gli attributi di un elemento SimpleXML quando non se ne conoscono i nomi?
Come si leggono tutti gli attributi di un elemento SimpleXML quando non se ne conoscono i nomi?
Was this page helpful?