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.
Indice dei contenuti
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:
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.
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>
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.
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.
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à.
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>