Passa ai contenuti principali

PHP - Leggere i dati da un file XML

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



<?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

Post più popolari

Windows 7 - Installare ed usare una stampante sul Print Server GetNet 3 Port 2 USB e 1 LPT

Su una rete di calcolatori (che sia di uso casalingo, Small Office o Medium Office) la perifrica più ricercata è la stampante. In molti casi la soluzione più semplice è quella di collegarla ad un PC che fa da server e da qui condividerla con tutta la rete. Spesso, però, ciò non è fattibile.  Per ovviare al problema esistono delle "scatrolette" che consentono di collegare la periferica ad uno switch o router (a seconda della grandezza della rete) chiamate Print Server. Alcuni Print Server (come quello oggetto del nostro post) possono usare più stampanti. Nel caso specifico il modello della GetNet può usare 1 stampante su Porta Parallela (LPT) e 2 stampanti (non multifunzioni) su porta USB 1.1 GetNet Print Server 1 Parallel e 2 USB Il modello in questione ha in dotazione un CD che dovrebbe essere installato, ma non è compatibile con Windows a 64 bit (che sia XP, Vista, 7 o 8), e da problemi con Windows Vista, 7, 8 Nel caso specifico illustre...

HP Z440 Workstation - Il problema dello spegni ed accendi improvviso ed il reset del BIOS

Chi possiede una Workstation HP Z440 (con processore Xeon) o è incappato o potrebbe incappare in un problema, dalla sera alla mattina che può essere devastante se, da un lato non ci sono state avvisaglie e si sta lavorando a qualche progetto. Scrivo questa nota per me, ma nello spirito del blog , la condivido per chi si trovasse nello stesso problema.

Windows 11 - Trovare il mouse sul monitor con il pulsante CTRL

Capita spesso che ci perdiamo il puntatore del mouse sullo schermo, soprattutto ora che sui PC fissi è abbastanza comune usare 2 o più monitor Questo tipo di programma era, in altri tempi, un add-on dell'Intellimouse di Microsoft (quelli a pallina del secolo e millennio scorso) che, ora, è stato inserito di default nel sistema