W3docs

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
ParametroDescrizione
$filenamePercorso o URL del file XML da caricare.
$class_nameClasse da istanziare. Deve estendere SimpleXMLElement; il valore predefinito è SimpleXMLElement stesso.
$optionsMaschera di bit delle costanti libxml come LIBXML_NOCDATA o LIBXML_NOBLANKS.
$namespace_or_prefixPrefisso o URI del namespace per limitare l'albero restituito.
$is_prefixtrue 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 Smith

Nota 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 EUR

Lavorare 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

  • false vs. avviso. Un file mancante o un errore di sintassi restituisce false e 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.99 funziona per coincidenza; (float) $book->price === 29.99 è quello che vuoi effettivamente.
  • Lettura di file remoti. $filename può essere un URL, ma questo richiede che allow_url_fopen sia abilitato in php.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.

Esercitazione

Pratica
Qual è lo scopo della funzione SimpleXML_Load_File in PHP?
Qual è lo scopo della funzione SimpleXML_Load_File in PHP?
Was this page helpful?