Spesso ci capita di dover far comunicare dati tra sistemi eterogenei. Per fare ciò usiamo un file intermedio XML (eXtended Markup Language) che contiene al suo interno tra tag uncinati non standard (cioè non come l'HTML che ha delle precise parole chiavi, ma mediante parole che definiamo a nostro piacimento).
Il problema è quello di far in modo che questi dati possano essere, poi importati nel sistema destinazione.
Per fare ciò è necessrio usare un linguaggio di programmazione, e visto che nella maggior parte dei casi si tratta di usare dati su Internet (in modo particolare Web e DataBase), in questo articolo useremo come il Linguaggio PHP, usatissimo (Facebook usa il PHP con DB MySQL per il sito), free e multipiattaforma.
In primo luogo la versione di PHP che andremo a considerare è la 5.0 o superiore perché è stata introdotta, in questa versione, una funzione chiamta SimpleXML che semplifica enormemente l'accesso ai dati, lasciando all'interprete del PHP il compito, piuttosto oneroso, di caricare i dati da file e/o da stringa in un array.
Il file che andremo a considerare è riferita ad una esportazione di un database gestionale di un immobiliare che deve essere importato in un altro sistema. Noi ci soffermeremo a leggere solo i dati ed a renderli "fruibili" ad uno script o programmino in PHP.
In primo luogo quello che a noi interessa è leggere i dati dal file che chiameremo immobili.xml
Il file è così composto (scaricabile in pacchetto completo di esempio PHP qui):
<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<dati>
<immobile>
<ID>133</ID>
<IDAGENZIA>2</IDAGENZIA>
<CODICE>F4123</CODICE>
<REGIONE><![CDATA[Campania]]></REGIONE>
<PROVINCIA>NA</PROVINCIA>
<COMUNE><![CDATA[Napoli]]></COMUNE>
<ZONA><![CDATA[Fuorigrotta]]></ZONA>
<DESCRIZIONE><![CDATA[]]></DESCRIZIONE>
<INAFFITTO>NO</INAFFITTO>
<CATEGORIA>Abitativo</CATEGORIA>
<TIPOIMMOBILE>1</TIPOIMMOBILE>
<SUPERFICIE>70</SUPERFICIE>
<VANI>2</VANI>
<PIANO><![CDATA[rialzato]]></PIANO>
<BALCONI>NO</BALCONI>
<GIARDINO>NO</GIARDINO>
<GIARDINO_MQ></GIARDINO_MQ>
<VISTA><![CDATA[]]></VISTA>
<PREZZO>125000.00</PREZZO>
<TRATTATIVA_RISERVATA>NO</TRATTATIVA_RISERVATA>
<TIPORISCALDAMENTO><![CDATA[]]></TIPORISCALDAMENTO>
<CANTINA>NO</CANTINA>
<TIPOGARAGE><![CDATA[]]></TIPOGARAGE>
<DISPONIBILITA><![CDATA[]]></DISPONIBILITA>
<SUBTIPOIMMOBILE>2</SUBTIPOIMMOBILE>
<IMAGES>
<IMMAGINE PATH="http://www.dicecca.net/blog/xml/378.jpg" MAP="0" PLAN="1" PRINCIPALE="1" TITOLO="piantina"></IMMAGINE>
<IMMAGINE PATH="http://www.dicecca.net/blog/xml/378.jpg" MAP="0" PLAN="0" PRINCIPALE="0" TITOLO="strada"></IMMAGINE>
<IMMAGINE PATH="http://www.dicecca.net/blog/xml/378.jpg" MAP="0" PLAN="0" PRINCIPALE="0" TITOLO="palazzo"></IMMAGINE>
</IMAGES>
<DATA_INSERIMENTO>01/06/2012</DATA_INSERIMENTO>
<DATA_AGGIORNAMENTO>18/06/2012</DATA_AGGIORNAMENTO>
<CODICEISTAT>063049</CODICEISTAT>
<TIPOIMMOBILE_TESTO><![CDATA[Appartamento]]></TIPOIMMOBILE_TESTO>
<SUBTIPOIMMOBILE_TESTO><![CDATA[Bilocale]]></SUBTIPOIMMOBILE_TESTO>
<NUMEROBAGNI>1</NUMEROBAGNI>
<NUMEROCAMERE>1</NUMEROCAMERE>
<POSTOAUTO>NO</POSTOAUTO>
<TIPOCUCINA><![CDATA[Cucinino]]></TIPOCUCINA>
<TERRAZZO>NO</TERRAZZO>
<STATO><![CDATA[Da ristrutturare]]></STATO>
<ASCENSORE>SI</ASCENSORE>
<ARREDATO>NO</ARREDATO>
<SPESEMENSILI>0.00</SPESEMENSILI>
<CLASSE_ENERGETICA>G</CLASSE_ENERGETICA>
<IPE>0</IPE>
</immobile>
<immobile>
<ID>658</ID>
<IDAGENZIA>2</IDAGENZIA>
<CODICE>F4094</CODICE>
<REGIONE><![CDATA[Campania]]></REGIONE>
<PROVINCIA>NA</PROVINCIA>
<COMUNE><![CDATA[Napoli]]></COMUNE>
<ZONA><![CDATA[Fuorigrotta]]></ZONA>
<DESCRIZIONE><![CDATA[]]></DESCRIZIONE>
<INAFFITTO>NO</INAFFITTO>
<CATEGORIA>Abitativo</CATEGORIA>
<TIPOIMMOBILE>1</TIPOIMMOBILE>
<SUPERFICIE>50</SUPERFICIE>
<VANI>2</VANI>
<PIANO><![CDATA[3]]></PIANO>
<BALCONI>NO</BALCONI>
<GIARDINO>NO</GIARDINO>
<GIARDINO_MQ></GIARDINO_MQ>
<VISTA><![CDATA[]]></VISTA>
<PREZZO>1480000.00</PREZZO>
<TRATTATIVA_RISERVATA>NO</TRATTATIVA_RISERVATA>
<TIPORISCALDAMENTO><![CDATA[]]></TIPORISCALDAMENTO>
<CANTINA>NO</CANTINA>
<TIPOGARAGE><![CDATA[]]></TIPOGARAGE>
<DISPONIBILITA><![CDATA[]]></DISPONIBILITA>
<SUBTIPOIMMOBILE>2</SUBTIPOIMMOBILE>
<DATA_INSERIMENTO>27/06/2012</DATA_INSERIMENTO>
<DATA_AGGIORNAMENTO>27/06/2012</DATA_AGGIORNAMENTO>
<CODICEISTAT>063049</CODICEISTAT>
<TIPOIMMOBILE_TESTO><![CDATA[Appartamento]]></TIPOIMMOBILE_TESTO>
<SUBTIPOIMMOBILE_TESTO><![CDATA[Bilocale]]></SUBTIPOIMMOBILE_TESTO>
<NUMEROBAGNI>0</NUMEROBAGNI>
<NUMEROCAMERE>0</NUMEROCAMERE>
<POSTOAUTO>NO</POSTOAUTO>
<TIPOCUCINA><![CDATA[]]></TIPOCUCINA>
<TERRAZZO>NO</TERRAZZO>
<STATO><![CDATA[]]></STATO>
<ASCENSORE>NO</ASCENSORE>
<ARREDATO>NO</ARREDATO>
<SPESEMENSILI>0.00</SPESEMENSILI>
<CLASSE_ENERGETICA></CLASSE_ENERGETICA>
<IPE>0</IPE>
</immobile>
</dati>
echo "<h2>Immobili Presenti nel file: (".count($xml->immobile).")</h2>";
Questa parte di codice, calcola (conta) quanti oggetti racchiusi dal tag immobile sono presenti nel file che abbiamo caricato precedentemente.
foreach($xml->immobile as $immobile)
{
/************************************************/
/* Inizio fase inserimento dati nelle variabili */
/************************************************/
$id = $immobile->ID; // questo valore lo dovrei far autoincrementare col contatore del DB da solo
$obj_id = $immobile->ZONA; // identifica la zona dell'immobile
$tipoimm = $immobile->SUBTIPOIMMOBILE; // questo campo identifica la categoria dell'immobile
....
Il ciclo foreach, che associa alla variabile $immobile il puntatore immobile della variabile $xml, consente di elencare tutti i dati <immobile> </immobile> presenti nel file XML in questione.
Va da se che <immobile> </immobile> è il contenitore più esterno degli oggetti immobile che ci interessa visualizzare.
Come è possibile osservare le variabili $id, $obj_id, $tipoimm, ecc. contengono il singolo dato cui punta la variabile $immobile definita all'interno del foreach.
Di particolare interesse, è l'accesso ai dati del gruppo <IMAGES> </IMAGES> i quali dati che ci interessa caricare non sono racchiusi all'interno di questi tag uncinati, ma sono degli attributi di un'altro uncinato è che è <IMMAGINE> </IMMAGINE>.
Considerato che il nostro caso specifico è l'importazione di dati da un gesionale immobiliare, è ovvio immaginare che le immagini (o fotografie) dell'immobile in questione possano essere più di una.
Per risolvere questo altro problema, cioè quello di accedere agli attributi di IMMAGINE (come ad esempio PATH, che ne indica il percorso su un server remoto), usiamo un altro ciclo, innestatato nel primo
// Il foreach punta direttamente alla sezione immagine che al suo interno contiene gli attributi
foreach ($immobile->IMAGES->IMMAGINE as $image)
{
// $image['PATH'] accede direttamente all'attributo PATH e così via
echo "
".$image['PATH']."
";
Nel secondo foreach la variabile foreach associa un puntatore di puntatore ad $image (che è a sua volta un array) e con la sintassi $image['PATH'] andiamo a leggere la casella dell'array che contiene il valore.
.
Commenti