W3docs

PHP XML Parser

Guida a PHP XML: lettura, scrittura e gestione di documenti XML con SimpleXML, DOMDocument e XMLReader.

PHP è un popolare linguaggio di scripting per lo sviluppo web che consente agli sviluppatori di creare siti web dinamici incorporando codice all'interno di HTML. Una delle sue funzionalità più utili è la capacità di lavorare con XML, un linguaggio di markup progettato per archiviare e trasportare dati.

In questa guida tratteremo le funzionalità XML di PHP, inclusi vantaggi, sintassi ed esempi pratici. Al termine saprai come lavorare con XML per costruire siti web e applicazioni migliori.

Che cos'è XML?

XML sta per "eXtensible Markup Language". È un linguaggio di markup che consente agli sviluppatori di definire i propri tag e le proprie strutture di documento, rendendolo un linguaggio estremamente flessibile e personalizzabile. XML viene comunemente utilizzato per archiviare e trasportare dati, ad esempio nei servizi web, nei database e nei feed RSS.

XML è simile a HTML, ma mentre HTML definisce come le pagine web vengono visualizzate in un browser, XML definisce la struttura e il contenuto dei dati. I tag XML vengono usati per identificare gli elementi dei dati e le loro relazioni, facilitando il trasferimento di dati tra sistemi diversi.

Vantaggi dell'uso di XML in PHP

L'uso di XML in PHP offre diversi vantaggi, tra cui:

  • Scambio di dati: XML è un formato ideale per lo scambio di dati tra sistemi e piattaforme diverse. Poiché XML è indipendente dalla piattaforma, i dati possono essere facilmente trasferiti tra sistemi indipendentemente dal sistema operativo o dal linguaggio di programmazione utilizzato.
  • Archiviazione dei dati: XML è un ottimo modo per archiviare e organizzare i dati in un formato strutturato. Usando XML per archiviare i dati, gli sviluppatori possono accedervi e manipolarli facilmente in base alle necessità.
  • Trasformazione dei dati: XML può essere facilmente trasformato in altri formati, come HTML, PDF e CSV, usando XSLT (Extensible Stylesheet Language Transformations).

Sintassi di XML in PHP

Per lavorare con XML in PHP è necessario conoscere la sintassi usata per definire i documenti XML. I documenti XML sono composti da elementi, attributi e valori.

Gli elementi vengono definiti usando tag di apertura e chiusura, come <book> e </book>. Gli elementi possono anche contenere elementi figlio, ad esempio:

<book>
  <title>The Great Gatsby</title>
  <author>F. Scott Fitzgerald</author>
</book>

Gli attributi vengono usati per fornire informazioni aggiuntive sugli elementi, ad esempio:

<book id="1234">
  <title>The Great Gatsby</title>
  <author>F. Scott Fitzgerald</author>
</book>

I valori sono il contenuto di un elemento, come "The Great Gatsby" o "F. Scott Fitzgerald".

Quale approccio XML usare?

PHP include tre parser; scegliere quello giusto è importante:

  • SimpleXML — l'API più semplice. Trasforma un documento XML in un albero di oggetti navigabile con la normale sintassi delle proprietà ($xml->book->title). Ideale per documenti di piccole e medie dimensioni con una struttura nota. Questa guida si concentra su SimpleXML; consulta PHP SimpleXML per un riferimento più approfondito.
  • DOMDocument (estensione DOM) — un'implementazione DOM completa conforme W3C. Più verbosa, ma consente di creare, spostare e rimuovere nodi con precisione; è necessaria per XSLT e la validazione. Vedi PHP XML DOM.
  • XMLReader / XMLWriter — un parser streaming a estrazione. Legge un nodo alla volta invece di caricare l'intero albero in memoria, ed è la scelta giusta per file molto grandi (centinaia di MB) in cui SimpleXML e DOM esaurirebbero la memoria.

Le funzioni SAX storiche xml_parser_create() esistono ancora ma vengono raramente usate nel codice moderno; SimpleXML copre lo stesso spazio con molto meno codice.

Lettura di un documento XML con SimpleXML

Per caricare un file XML in un albero di oggetti, usa la funzione simplexml_load_file(). Se la sorgente è una stringa (ad esempio la risposta di un'API) anziché un file, usa invece simplexml_load_string().

Controlla sempre il valore di ritorno: su un documento malformato entrambe le funzioni restituiscono false anziché lanciare un'eccezione, quindi un risultato non verificato è una fonte comune di bug silenziosi.

$xml = simplexml_load_file("books.xml");
if ($xml === false) {
    echo "Failed to load XML file.";
    exit;
}

Questo legge il file XML e lo converte in un oggetto SimpleXMLElement, accessibile tramite la sintassi orientata agli oggetti di PHP. Gli elementi figlio diventano proprietà e gli elementi ripetuti (come più tag <book>) si comportano come un elenco iterabile.

Lettura degli attributi

Gli attributi non sono proprietà — si leggono con la sintassi array sull'elemento. Dato <book id="1234">, l'id è $book['id']:

$xml = simplexml_load_string('<book id="1234"><title>The Great Gatsby</title></book>');
echo $xml['id'];     // 1234
echo $xml->title;    // The Great Gatsby

Si noti che i valori SimpleXML sono oggetti, non stringhe semplici. Esegui il cast con (string) quando hai bisogno di una stringa reale (ad esempio, prima di un confronto rigoroso o di json_encode).

Scrittura di un documento XML con SimpleXML

Per costruire XML da zero, crea un SimpleXMLElement con un elemento radice e aggiungi figli con addChild():

$xml = new SimpleXMLElement('<books></books>');
$book = $xml->addChild('book');
$book->addChild('title', 'The Great Gatsby');
$book->addChild('author', 'F. Scott Fitzgerald');
$xml->asXML('books.xml');

Questo crea un SimpleXMLElement con l'elemento radice <books>, aggiunge un figlio <book> con i figli <title> e <author>, e salva il documento in books.xml. Chiamare asXML() senza argomenti restituisce l'XML come stringa invece di scrivere un file, il che è utile quando lo si deve inviare in una risposta HTTP.

Esempi pratici

Vediamo alcuni esempi pratici di utilizzo di XML in PHP.

Lettura di dati XML

Supponiamo di avere un file XML chiamato "books.xml" con i seguenti dati:

<books>
  <book>
    <title>The Great Gatsby</title>
    <author>F. Scott Fitzgerald</author>
  </book>
  <book>
    <title>To Kill a Mockingbird</title>
    <author>Harper Lee</author>
  </book>
</books>

Per leggere questi dati in PHP, puoi usare la funzione simplexml_load_file(), in questo modo:

$xml = simplexml_load_file("books.xml");
if ($xml === false) {
    echo "Failed to load XML file.";
    exit;
}
foreach ($xml->book as $book) {
  echo $book->title . " by " . $book->author . "\n";
}

Questo codice carica il file XML in un oggetto SimpleXMLElement, quindi itera su ogni elemento <book> usando un ciclo foreach. All'interno del ciclo accede agli elementi figlio <title> e <author> tramite sintassi orientata agli oggetti e li stampa nella console.

Scrittura di dati XML

Supponiamo di voler creare un nuovo file XML con i seguenti dati:

<colors>
  <color>
    <name>Red</name>
    <hex>#FF0000</hex>
  </color>
  <color>
    <name>Green</name>
    <hex>#00FF00</hex>
  </color>
  <color>
    <name>Blue</name>
    <hex>#0000FF</hex>
  </color>
</colors>

Per creare questi dati XML in PHP, puoi usare la classe SimpleXMLElement, in questo modo:

$xml = new SimpleXMLElement('<colors></colors>');
$red = $xml->addChild('color');
$red->addChild('name', 'Red');
$red->addChild('hex', '#FF0000');
$green = $xml->addChild('color');
$green->addChild('name', 'Green');
$green->addChild('hex', '#00FF00');
$blue = $xml->addChild('color');
$blue->addChild('name', 'Blue');
$blue->addChild('hex', '#0000FF');
$xml->asXML('colors.xml');

Questo codice crea un nuovo oggetto SimpleXMLElement con l'elemento radice <colors>. Aggiunge quindi tre elementi figlio <color>, ciascuno con due elementi figlio <name> e <hex>, impostandone i valori di conseguenza. Infine, salva il documento XML in un file chiamato "colors.xml".

Errori comuni

  • Risultato del caricamento non verificato. simplexml_load_file() e simplexml_load_string() restituiscono false, non null, in caso di errore di analisi. Verifica con === false prima di usare il risultato.
  • I valori sono oggetti, non stringhe. $xml->title è un SimpleXMLElement. Funziona nei contesti stringa (echo, concatenazione) ma fallisce in confronti inaspettati; esegui il cast con (string) in caso di dubbio.
  • Errori di analisi soppressi. Per capire perché l'analisi è fallita, chiama libxml_use_internal_errors(true) prima del caricamento, poi leggi libxml_get_errors().
  • Namespace. Se il tuo XML usa namespace (es. xmlns:), l'accesso tramite proprietà non troverà gli elementi — usa children() o xpath() con il namespace registrato.
  • Input non attendibile. Non analizzare XML proveniente da fonti non attendibili senza precauzioni: gli attacchi tramite entità esterne (XXE) sono un rischio reale. Nelle versioni moderne di PHP il caricamento delle entità rilevanti è disabilitato per impostazione predefinita, ma verifica prima di elaborare XML fornito dall'utente.

Argomenti correlati

Conclusione

In questa guida abbiamo visto cos'è XML, perché è utile e come leggere, scrivere e manipolare documenti XML in PHP con la libreria SimpleXML, oltre agli errori comuni a cui prestare attenzione. SimpleXML è il modo più rapido per gestire dati XML strutturati in PHP; ricorri a DOMDocument quando hai bisogno di un controllo preciso sui nodi e a XMLReader per file molto grandi. Si noti che le funzioni XML di PHP richiedono l'estensione libxml, abilitata per impostazione predefinita nella maggior parte delle installazioni standard.

Pratica

Pratica
Quali affermazioni sul lavoro con XML in PHP usando SimpleXML sono vere?
Quali affermazioni sul lavoro con XML in PHP usando SimpleXML sono vere?
Was this page helpful?