File XML: cosa sono e come gestirli in PHP

File XML: cosa sono e come gestirli in PHP

L'ultimo formato di file che andiamo a presentare è l'eXtensible Markup Language, meglio noto come XML. Si tratta di uno standard che consente di formattare e memorizzare in maniera persistente dati strutturati.

È un formato molto conosciuto nel mondo informatico, tuttavia con l'introduzione della fattura elettronica è probabilmente diventato noto anche ai non addetti ai lavori.

PHP offre un'ampia gamma di funzioni per gestire i documenti in formato XML, qui vedremo solamente alcune di queste in quanto non basterebbe una semplice guida per analizzarle tutte in dettaglio.

Cos'è XML

XML è una specifica nata per creare linguaggi di markup (marcatura), ossia linguaggi che consentono di descrivere i dati attraverso l'utilizzo di elementi chiamati tag. XML é molto simile ad HTML come struttura, tuttavia esistono due sostanziali differenze con il linguaggio base utilizzato per creare siti web:

  • XML non definisce un insieme specifico di tag che è necessario utilizzare: possiamo usare tag personalizzati (da qui l'acronimo eXtensible)
  • Un file XML non ammette errori di sintassi: mentre una pagina HTML funziona anche se omettiamo la chiusura di un tag, la lettura di un documento XML mal formattato genererebbe un errore.

Un documento XML ha estensione .xml e il suo contenuto è leggibile attraverso un qualsiasi editor di testo semplice. Vediamo un esempio di file XML e analizziamone la sintassi.

Sintassi di un file XML

Come già detto, un file XML è composto da una serie di tag che descrivono il contenuto del documento. Questi vengono indicati tramite i caratteri < e >.

Un esempio di file XML è il seguente

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <brand>Renault</brand>
        <model>Clio</model>
        <engine>2.0</engine>
    </car>
</cars>
  • La riga 1 contiene informazioni circa la versione e la codifica utilizzati per il documento. In questo caso la codifica è utf-8.
  • Le righe 2-8 contengono gli elementi, ciascuno dei quali ha un marcatore di inizio e uno di fine, quest'ultimo indicato con l'aggiunta del carattere / (slash).
  • Il testo delimitato dal tag di apertura e da quello di chiusura rappresenta il valore di un elemento.
  • Il primo elemento (cars) è chiamato elemento radice o root. Insieme agli elementi successivi forma una struttura ad albero.

Abbiamo dato dei nomi personalizzati ai tag. In HTML invece esistono un set di tag da utilizzare per formattare il documento, ad esempio con i tag

<p></p>

realizziamo un paragrafo.

PHP mette a disposizione diverse funzioni per la gestione dei file XML. Vediamo alcune di queste.

Leggere formato XML in PHP

Per leggere un documento in formato XML in PHP è possibile utilizzare l'estensione SimpleXML che, come dice il nome stesso, consente una gestione semplice di questo formato.

Esistono due funzioni che possiamo utilizzare a tale scopo:

  • simplexml_load_file(): legge un file in formato XML e restituisce un oggetto della classe SimpleXMLElement.
  • simplexml_load_string(): legge una stringa in formato XML e restituisce un oggetto della classe SimpleXMLElement.

Entrambe le funzioni restituiscono false in caso di errore.

Nota: Dato che entrambe le funzioni possono restituire valori non booleani che vengono valutati come false, è bene ricordarsi di usare l'operatore di confronto === nelle condizioni.

Prendendo l'esempio precedente, possiamo scrivere il seguente codice PHP

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <brand>Renault</brand>
        <model>Clio</model>
        <engine>2.0</engine>
    </car>
</cars>
XML;

var_dump(simplexml_load_string($xml));

che produce l'output

object(SimpleXMLElement)#1 (1) {
  ["car"]=>
  object(SimpleXMLElement)#2 (3) {
    ["brand"]=>
    string(7) "Renault"
    ["model"]=>
    string(4) "Clio"
    ["engine"]=>
    string(3) "2.0"
  }
}

Nel nostro esempio l'oggetto ritornato rappresenta l'elemento cars del documento e ha una proprietà di nome car che contiene a sua volta un altro oggetto SimpleXMLElement, contenente 3 proprietà: brand, model e engine.

Vediamo come è possibile accedere in maniera singola a ciascuno di questi elementi.

Accedere ai singoli valori

Come un qualsiasi altro oggetto, tutte le proprietà di un oggetto della classe SimpleXMLElement sono accessibili tramite l'operatore ->.

Vediamo alcuni esempi

<?php
$xml = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <brand>Renault</brand>
        <model>Clio</model>
        <engine>2.0</engine>
    </car>
</cars>
XML;

$simpleXML = simplexml_load_string($xml);

echo "Marca ".$simpleXML->car->brand."\n"; // Renault
echo "Modello ".$simpleXML->car->model."\n"; // Clio
echo "Cilindrata ".$simpleXML->car->engine."\n"; // 2.0

Negli esempi mostrati fino ad ora abbiamo utilizzato la sintassi Heredoc tramite il <<<, che ci consente di gestire stringhe su più righe senza la necessità di effettuare concatenazione e migliorando la leggibilità.

Leggere file XML in PHP

Vediamo adesso un esempio di come leggere un file XML tramite la funzione simplexml_load_file().

Supponiamo di avere un file cars.xml con il seguente contenuto

<?xml version="1.0" encoding="UTF-8"?>
<cars>
    <car>
        <brand>Ferrari</brand>
        <model>F40</model>
        <engine>2.9 V8</engine>
    </car>
    <car>
        <brand>Porsche</brand>
        <model>Carrera GT</model>
        <engine>5.7 V10</engine>
    </car>
    <car>
        <brand>Lamborghini</brand>
        <model>Diablo</model>
        <engine>5.7 V12</engine>
    </car>
    <car>
        <brand>BMW</brand>
        <model>M3</model>
        <engine>3.2 L6</engine>
    </car>
</cars>

Vogliamo leggere il file con PHP e mostrare il risultato in una tabella HTML.

Di seguito è mostrato il codice necessario

<?php
$cars = simplexml_load_file('cars.xml');
?>
<table>
    <tbody>
        <?php foreach ($cars as $car):?>
        <tr>
            <td><?php echo $car->brand;?></td>
            <td><?php echo $car->model;?></td>
            <td><?php echo $car->engine;?></td>
        </tr>
        <?php endforeach;?>
    </tbody>
<table>

che dà come output il seguente codice HTML

<table>
    <tbody>
        <tr>
            <td>Ferrari</td>
            <td>F40</td>
            <td>2.9 V8</td>
        </tr>
        <tr>
            <td>Porsche</td>
            <td>Carrera GT</td>
            <td>5.7 V10</td>
        </tr>
        <tr>
            <td>Lamborghini</td>
            <td>Diablo</td>
            <td>5.7 V12</td>
        </tr>
        <tr>
            <td>BMW</td>
            <td>M3</td>
            <td>3.2 L6</td>
        </tr>
    </tbody>
<table>