simplexml_load_file()
Guida a simplexml_load_file() in PHP: carica file XML in un oggetto SimpleXMLElement navigabile con esempi pratici e gestione degli errori.
Introduzione
simplexml_load_file() legge un file XML dal disco (o da un URL) e ne converte il contenuto in un oggetto SimpleXMLElement che puoi navigare con la normale sintassi PHP delle proprietà e degli array. È il punto di accesso basato su file dell'estensione SimpleXML — il modo più semplice per trasformare un documento XML in qualcosa su cui iterare e leggere.
Usala ogni volta che hai un file XML — un file di configurazione, un feed RSS/Atom, una risposta API salvata su disco, o una sitemap — e vuoi estrarne i valori senza scrivere un parser manualmente. Se il tuo XML si trova in una stringa invece che in un file, usa la funzione analoga simplexml_load_string().
Questo capitolo tratta la firma della funzione, un esempio completo funzionante (incluso l'XML che legge), come accedere agli attributi e ai namespace, e come gestire gli errori di caricamento in modo corretto.
Sintassi
simplexml_load_file(
string $filename,
?string $class_name = SimpleXMLElement::class,
int $options = 0,
string $namespace_or_prefix = "",
bool $is_prefix = false
): SimpleXMLElement|false| Parametro | Descrizione |
|---|---|
$filename | Percorso o URL del file XML da caricare. |
$class_name | Classe da istanziare. Deve estendere SimpleXMLElement; il valore predefinito è SimpleXMLElement stesso. |
$options | Maschera di bit delle costanti libxml come LIBXML_NOCDATA o LIBXML_NOBLANKS. |
$namespace_or_prefix | Prefisso o URI del namespace per limitare l'albero restituito. |
$is_prefix | true se l'argomento precedente è un prefisso, false se è un URI. |
Valore restituito: un SimpleXMLElement in caso di successo, o false se il file non può essere letto o contiene XML non valido.
Un esempio completo
Si assume che un file chiamato books.xml si trovi nella stessa directory dello script:
<?xml version="1.0" encoding="UTF-8"?>
<library>
<book id="b1">
<title>The PHP Way</title>
<author>Jane Doe</author>
<price currency="USD">29.99</price>
</book>
<book id="b2">
<title>XML in Practice</title>
<author>John Smith</author>
<price currency="EUR">24.50</price>
</book>
</library>Caricalo, verifica che sia stato analizzato correttamente, e itera sugli elementi <book>:
<?php
$xml = simplexml_load_file('books.xml');
if ($xml === false) {
echo "Failed to load XML file.\n";
exit(1);
}
foreach ($xml->book as $book) {
echo $book->title . " by " . $book->author . "\n";
}Output:
The PHP Way by Jane Doe
XML in Practice by John SmithNota il confronto rigoroso === false. Gli oggetti SimpleXML sono "truthy", quindi un controllo generico if (!$xml) può comportarsi in modo errato in casi limite — confronta sempre esplicitamente con false.
Lettura degli attributi
SimpleXML espone gli elementi figlio come proprietà dell'oggetto ($book->title) e gli attributi XML tramite accesso stile array ($book['id']). Poiché i valori sono oggetti SimpleXMLElement e non stringhe semplici, esegui il cast con (string) prima di usarli in calcoli o confronti:
<?php
$xml = simplexml_load_file('books.xml');
foreach ($xml->book as $book) {
$id = (string) $book['id'];
$currency = (string) $book->price['currency'];
echo "{$id}: {$book->title} — {$book->price} {$currency}\n";
}Output:
b1: The PHP Way — 29.99 USD
b2: XML in Practice — 24.50 EURLavorare con i namespace
Quando un documento dichiara namespace XML, l'accesso tramite proprietà raggiunge solo il namespace predefinito. Usa ->children($namespaceUri) per scendere in un ramo con namespace e ->attributes($namespaceUri) per leggere gli attributi con namespace:
<?php
// Access elements in the Atom namespace.
$atom = $xml->children('http://www.w3.org/2005/Atom');
echo $atom->title;Per un'analisi più approfondita dei namespace e della navigazione, consulta SimpleXML in PHP.
Gestione degli errori di caricamento
Per impostazione predefinita, l'XML non valido genera avvisi PHP. Per sopprimerli e ispezionare gli errori autonomamente, attiva la gestione interna degli errori con libxml_use_internal_errors() prima del caricamento:
<?php
libxml_use_internal_errors(true);
$xml = simplexml_load_file('missing.xml');
if ($xml === false) {
echo "Could not load the file:\n";
foreach (libxml_get_errors() as $error) {
echo " " . trim($error->message) . "\n";
}
libxml_clear_errors();
}Output:
Could not load the file:
failed to load external entity "missing.xml"Questo schema mantiene l'output pulito e ti dà accesso strutturato a ogni errore di parsing tramite libxml_get_errors().
Errori comuni
falsevs. avviso. Un file mancante o un errore di sintassi restituiscefalsee genera un avviso a meno che non si abiliti la gestione interna degli errori. Controlla sempre il valore restituito.- Cast prima del confronto.
$book->price == 29.99funziona per coincidenza;(float) $book->price === 29.99è quello che vuoi effettivamente. - Lettura di file remoti.
$filenamepuò essere un URL, ma questo richiede cheallow_url_fopensia abilitato inphp.ini. - Scrittura. SimpleXML è ottimo per la lettura. Per serializzare un elemento in una stringa XML, chiama
asXML().
Conclusione
simplexml_load_file() è il modo più rapido per caricare un file XML in un albero di oggetti navigabile in PHP. Combinala con i controlli rigorosi === false, i cast (string) durante la lettura dei valori, e la gestione degli errori libxml, per ottenere una base solida per consumare feed, configurazioni e API XML. Per input di tipo stringa usa simplexml_load_string(), e per tecniche di navigazione complete continua con SimpleXML in PHP.