PHP SimpleXML - simplexml_load_file e simplexml_load_string
L'estensione SimpleXML di PHP consente di analizzare e manipolare dati XML in modo semplice tramite simplexml_load_file e simplexml_load_string.
Come ottenere e leggere XML con PHP SimpleXML
L'estensione SimpleXML di PHP è il modo più rapido per leggere e modificare documenti XML. Invece di percorrere manualmente un albero di nodi, SimpleXML trasforma l'intero documento in un normale oggetto PHP i cui elementi sono accessibili con la familare sintassi a proprietà e array — $xml->title, $xml->item[0], $xml['id'].
Questo capitolo tratta le due funzioni utilizzate per caricare XML — simplexml_load_file() (per un file o URL) e simplexml_load_string() (per XML già disponibile come stringa) — e poi come leggere elementi, leggere attributi, iterare su nodi ripetuti, aggiungere nuovi dati e serializzare il risultato in XML.
SimpleXML è incluso nella distribuzione standard di PHP ed è abilitato per impostazione predefinita, quindi di solito non è necessario installare nulla.
Quando usare SimpleXML (e quando no)
- Usa SimpleXML per leggere e modificare leggermente XML ben formato: file di configurazione, feed RSS/Atom, semplici risposte API, sitemap.
- Ricorri a DOMDocument quando hai bisogno di un controllo granulare: inserimento di nodi in una posizione specifica, gestione dei commenti o validazione dello schema.
- Usa il Parser XML (Expat) per documenti molto grandi che desideri elaborare evento per evento in streaming, senza caricare tutto in memoria.
Caricamento dei dati XML
Il primo passo consiste nell'inserire l'XML in un oggetto SimpleXML. Esistono due punti di ingresso, e la scelta dipende solo da dove si trova attualmente il tuo XML.
Caricare un file XML con simplexml_load_file()
simplexml_load_file() legge XML da un percorso locale o da un URL e restituisce un SimpleXMLElement. In caso di errore di parsing restituisce false ed emette un avviso.
<?php
// books.xml on disk, or "https://example.com/feed.xml"
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML.";
} else {
echo $xml->book[0]->title; // first <title>
}Caricare una stringa XML con simplexml_load_string()
Quando l'XML si trova già in una variabile — ad esempio il corpo di una risposta HTTP — usa invece simplexml_load_string().
Entrambe le funzioni restituiscono l'elemento radice del documento, non un wrapper attorno ad esso. Nell'esempio precedente, quindi, $xml è <root>, e $xml->child è il nodo <child> al suo interno.
Suggerimento: un
SimpleXMLElementcontiene un valore simile a una stringa ma è comunque un oggetto. Racchiudilo in(string)(o concatenalo) ogni volta che hai bisogno di una stringa PHP semplice — ad esempio$title = (string) $xml->book[0]->title;. Consulta convertire SimpleXML in una stringa per i dettagli.
Accesso ai dati XML
Una volta caricato, puoi leggere il documento con la sintassi a oggetti e array.
Accesso agli elementi
Gli elementi figlio sono proprietà dell'oggetto. Quando un tag si ripete, accedi ad esso come un array; [0] è la prima occorrenza.
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
echo $xml->book[0]->title, "\n"; // PHP Basics
echo $xml->book[1]->title, "\n"; // Advanced XMLIterare su elementi ripetuti
Poiché i tag ripetuti si comportano come un elenco iterabile, foreach è il modo naturale per leggerli tutti:
<?php
$data = <<<XML
<library>
<book><title>PHP Basics</title></book>
<book><title>Advanced XML</title></book>
</library>
XML;
$xml = simplexml_load_string($data);
foreach ($xml->book as $book) {
echo $book->title, "\n";
}
// PHP Basics
// Advanced XMLAccesso agli attributi
Gli attributi si raggiungono con la sintassi array sull'elemento che li contiene:
<?php
$xml = simplexml_load_string('<book id="42" lang="en"><title>PHP</title></book>');
echo $xml['id'], "\n"; // 42
echo $xml['lang'], "\n"; // enModifica dei dati XML
SimpleXML può anche costruire e modificare documenti direttamente.
Aggiungere elementi
addChild() aggiunge un nuovo elemento e restituisce l'elemento creato, quindi è possibile continuare a concatenare:
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->child; // ValueAggiungere attributi
addAttribute() aggiunge un attributo all'elemento su cui viene chiamato:
<?php
$xml = simplexml_load_string('<root><child>Value</child></root>');
$xml->child->addAttribute('attribute', 'on');
echo $xml->child['attribute']; // onConversione di SimpleXML in XML
asXML() serializza l'oggetto in una stringa XML (senza argomenti) oppure la scrive direttamente su un file (quando si passa un percorso). È il modo per rendere persistenti le modifiche apportate. Consulta il metodo asXML per ulteriori dettagli.
<?php
$xml = simplexml_load_string('<root></root>');
$xml->addChild('child', 'Value');
echo $xml->asXML();
// <?xml version="1.0"?>
// <root><child>Value</child></root>Gestione di XML non valido
In caso di errore, queste funzioni restituiscono false e attivano un avviso, che è difficile da gestire. Trasforma gli avvisi in errori raccoglibili con libxml_use_internal_errors():
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_string('<root><child></root>'); // missing </child>
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo trim($error->message), "\n";
}
libxml_clear_errors();
}Conclusione
SimpleXML è il percorso più rapido da un file o stringa XML a dati PHP leggibili. Carica con simplexml_load_file() o simplexml_load_string(), leggi elementi e attributi con la sintassi a proprietà e array, itera sui nodi ripetuti con foreach, modifica con addChild() e addAttribute(), e serializza di nuovo con asXML(). Per elaborazioni più complesse, passa a DOMDocument; per lo streaming di file di grandi dimensioni, usa il Parser XML.