W3docs

Parser XML in PHP: Guida Completa

Scopri come analizzare XML in PHP con SimpleXML, XMLReader e DOM. Esempi eseguibili, gestione degli errori con libxml e come scegliere il parser giusto.

XML (eXtensible Markup Language) è un formato ampiamente utilizzato per lo scambio di dati strutturati tra applicazioni, web service e piattaforme. Poiché molte API, file di configurazione e feed lo utilizzano ancora, saper leggere XML in PHP è un'abilità pratica. Questa guida illustra i tre parser XML integrati disponibili in PHP — SimpleXML, XMLReader e DOM — mostra esempi eseguibili per ciascuno e ti aiuta a scegliere quello più adatto al tuo caso d'uso.

Cos'è un parser XML PHP?

Un parser XML è una libreria che legge un documento XML, verifica che sia ben formato e fornisce al codice un accesso strutturato ai suoi elementi, attributi e testo. PHP include tre parser nativi, tutti costruiti sullo stesso motore sottostante libxml:

  • SimpleXML — un parser basato su albero che carica l'intero documento in un oggetto facile da usare.
  • DOM — un parser basato su albero che segue il Document Object Model W3C, con un'API più ricca per la navigazione e la modifica.
  • XMLReader — un parser in streaming, basato su cursore, che legge un nodo alla volta senza caricare l'intero documento in memoria.

"Basato su albero" significa che l'intero documento viene mantenuto in memoria come struttura navigabile — semplice da usare ma dispendioso in termini di memoria per file grandi. "In streaming" (detto anche pull parsing) significa che il parser percorre il documento nodo per nodo, mantenendo basso l'utilizzo della memoria per file di grandi dimensioni.

Tutti gli esempi seguenti utilizzano lo stesso documento di esempio, incluso inline come stringa in modo da poterli eseguire così come sono:

$xmlString = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<library>
  <book>
    <title>PHP for Beginners</title>
    <author>Jane Doe</author>
    <year>2021</year>
  </book>
  <book>
    <title>Advanced PHP</title>
    <author>John Smith</author>
    <year>2023</year>
  </book>
</library>
XML;

SimpleXML

SimpleXML offre il modo più rapido per leggere XML. Si carica un documento in un oggetto SimpleXMLElement e si accede ai dati usando proprietà dell'oggetto ordinarie — $xml->book[0]->title anziché chiamate a metodi. È ideale per documenti di piccole e medie dimensioni la cui struttura è già nota.

Usa simplexml_load_string() per XML già disponibile come stringa, oppure simplexml_load_file() per leggere direttamente da un file o URL.

$xml = simplexml_load_string($xmlString);

// Access a single value by position
echo $xml->book[0]->title . "\n";

// Loop over every <book> element
foreach ($xml->book as $book) {
    echo "{$book->title} by {$book->author} ({$book->year})\n";
}

Output:

PHP for Beginners
PHP for Beginners by Jane Doe (2021)
Advanced PHP by John Smith (2023)

Nota che i valori degli elementi sono oggetti SimpleXMLElement, non stringhe semplici. La concatenazione o echo li converte automaticamente in testo, ma usa il cast con (string) quando hai bisogno di una stringa effettiva. Consulta PHP SimpleXML per un'analisi più approfondita, inclusa la lettura di attributi e namespace.

XMLReader

XMLReader è un parser in streaming, forward-only. Invece di costruire un albero, avanza nel documento un nodo alla volta, mantenendo bassa la memoria indipendentemente dalla dimensione del file. Questo lo rende la scelta giusta per feed o esportazioni di grandi dimensioni in cui caricare tutto in una volta esaurirebbe la memoria.

Chiama read() per spostarti al nodo successivo, quindi ispeziona nodeType e name per decidere cosa fare. Usa open() per leggere da un file o URL, oppure XML() per leggere da una stringa.

$reader = new XMLReader();
$reader->XML($xmlString);

while ($reader->read()) {
    if ($reader->nodeType === XMLReader::ELEMENT && $reader->name === 'title') {
        echo $reader->readString() . "\n";
    }
}
$reader->close();

Output:

PHP for Beginners
Advanced PHP

Il compromesso è la convenienza: poiché XMLReader mantiene sempre un solo nodo, non c'è accesso casuale — non puoi tornare indietro o interrogare elementi arbitrari come con un albero. Un pattern comune è fare lo streaming fino all'elemento che interessa, poi passare quel sottoalbero a SimpleXML o DOM con expand().

DOM

L'estensione DOM implementa il Document Object Model W3C standard. Come SimpleXML carica l'intero documento in un albero, ma espone un'API più completa per la navigazione dei nodi, le query con XPath e la creazione o modifica di elementi. Ricorri a DOM quando devi scrivere o ristrutturare XML, non solo leggerlo.

Carica XML con loadXML() (da una stringa) o load() (da un file), poi naviga l'albero con metodi come getElementsByTagName().

$dom = new DOMDocument();
$dom->loadXML($xmlString);

$titles = $dom->getElementsByTagName('title');
foreach ($titles as $title) {
    echo $title->nodeValue . "\n";
}

Output:

PHP for Beginners
Advanced PHP

getElementsByTagName() restituisce una DOMNodeList che puoi iterare o indicizzare con ->item(0). Per query più complesse puoi abbinare DOMDocument con DOMXPath. Consulta PHP XML DOM per l'API completa.

Gestione degli errori di parsing

Per impostazione predefinita, XML malformato genera avvisi PHP difficili da gestire in modo programmatico. Chiama libxml_use_internal_errors(true) per sopprimere quegli avvisi e raccogliere invece oggetti di errore strutturati con libxml_get_errors(). Tutti e tre i parser condividono questo meccanismo di errore libxml.

libxml_use_internal_errors(true);

$badXml = '<library><book><title>Unclosed</book></library>';
$xml = simplexml_load_string($badXml);

if ($xml === false) {
    echo "Failed to parse XML:\n";
    foreach (libxml_get_errors() as $error) {
        echo trim($error->message) . "\n";
    }
    libxml_clear_errors();
}

Output:

Failed to parse XML:
Opening and ending tag mismatch: title line 1 and book
Opening and ending tag mismatch: book line 1 and library
Premature end of data in tag library line 1

Verifica sempre il valore restituito da una funzione di caricamento (false in caso di errore) prima di utilizzare il risultato. Per ulteriori informazioni su questi helper, consulta PHP libxml.

Scegliere il parser XML PHP giusto

ParserModelloMemoriaIdeale per
SimpleXMLAlberoAltaLettura rapida di documenti piccoli/medi
DOMAlberoAltaModifica, query XPath, generazione di XML
XMLReaderStreamingBassaDocumenti grandi letti una volta, dall'alto verso il basso

In sintesi:

  • Scegli SimpleXML quando vuoi semplicemente leggere XML noto di dimensioni moderate con il minimo codice.
  • Scegli DOM quando devi modificare documenti, eseguire query XPath o generare XML.
  • Scegli XMLReader quando il documento è abbastanza grande da rendere problematico caricarlo tutto in memoria.

Conclusione

PHP offre tre parser XML nativi, ciascuno adatto a un compito diverso: SimpleXML per letture rapide e semplici, DOM per la manipolazione completa e XMLReader per lo streaming efficiente in termini di memoria di file di grandi dimensioni. Abbina il parser alla dimensione del documento e a se hai bisogno solo di leggere o anche di scrivere, avvolgi i caricamenti nella gestione degli errori libxml, e potrai analizzare XML in modo affidabile in qualsiasi progetto PHP.

Per approfondire, esplora PHP SimpleXML parser, PHP XML parser (Expat) e PHP XML DOM.

Pratica

Pratica
Quali di questi sono parser XML PHP integrati trattati in questa guida?
Quali di questi sono parser XML PHP integrati trattati in questa guida?
Was this page helpful?