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

Mac OS X - Installare ed usare una stampante sul Print Server GetNet 3 Port 2 USB e 1 LPT

Abbiamo visto come installare il Print Server GetNet 3 in 1 sui più diffusi sistemi operativi Windows (vedi articoli correlati in fondo al post). La "scatoletta" ha anche un protocollo di comunicazione Apple Talk, quindi può essere collegata (fare da tramite) anche a stampanti che abbiano la gestione post script integrata (quasi tutte le stampanti salvo quelle del gruppo Ricoh che hanno bisogno di un apposito moduol installato) sul Mac. Print Server GetNet 1 Parallela e 2 USB Il metodo di installazione è molto simile a quello visto su Windows, con la differenza sostanziale che non è necessario scegliere tra moltissimi modelli, ma si gestisce in modo più semplice. Purtroppo sul Mac non è possibile (allo stato attuale) collegare print server di tipo TP-Link, ovvero replicatori di porta USB su Lan, in quanto non esiste un driver adatto. Detto questo, consideriamo la stampante che vogliamo collegare al Mac. Il caso che abbiamo usato nei precedenti post,

BlackBerry - Importare i dati da altri cellulari

English translated post Un amico mi porta un BlackBerry Pearl 8110 e mi chiede di trasferire i dati dal suo cellulare Nokia a questo telefono. Premesso che personalmente non ho mai reputato il BlackBerry un telefono "semplice", l'operazione si è reputata piuttosto complessa. Scartata l'idea di mandare i vcard via bluetooth (come si fa con quasi tutti i Nokia e Samsung), l'unica alternativa è quella di appoggiarsi a Microsoft Outlook !!! Come fare? 1 - Installare il Microsoft Outlook (XP o 2003) nel proprio PC 2 - Installare (nel caso specifico del Nokia) il programma Nokia PC Suite 3 - Sincronizzare solo la Rubrica (ovviamente dipende sempre se il cellulare Nokia è il Vostro o di un Vostro amico) del Nokia con l'Outlook, così che tutti i dati presenti nella Rubrica siano copiati nella sezione Contatti dell'Outlook 4 - Scaricare l'ultima versione del BlackBerry Desktop Manager (se il pacchetto è quello Vodafone, la versione sul CD non è molto efficac

Joomla! - Mettere la testata in Stampa

Come è noto Joomla! è uno dei più usati CMS (Content Managment System) che consente di avere un ambiente (environment) sul quale costruire e sviluppare siti e portali. Uno dei problemi più noti è quello di poter inserire la testata nel file da stampare. Ad esempio se il mio sito si chiama dicecca.net - Blog ed ha un logo particolare che voglio pubblicare come testata, nella conformazione classica, non posso farlo. Come risolvere? Premesso che tutto il sistema è scritto in linguaggio PHP, il file che viene chiamato in causa è component.php che si trova nella cartella /[sito (1)] /templates/system Il file ( che è possibile scaricare qui in formato testo ), alla riga 40 inizia il Body del testo. Alla riga 41 inizia l'inclusione del testo dell'articolo che si è deciso di stampare, che a sua volta viene aperto in una finestra popup. Dando un taso invio, dalla riga 41 è possibile inserire il riferimento ad una immagine e/o un formattato HTML della testata del nos