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

Link al Web

Lista di Comandi Linux Mozilla FireFox / Thunderbird / FileZilla Portable FireFox Download localizzati FireFox Portable - Pagina download localizzati ThunterBird Portable - Pagina dei download localizzati FileZilla Portable Avast Avast Download Avast Registrazione Vecchie versioni Avast Attivazione della copia gratuita per 1 anno Adobe Reader Get Adobe Acrobat e Adobe Reader Cartella tutte le versioni Adobe Reader da scaricare offline Microsoft 365 Accedere ad area riservata Microsoft 365 Scarica Office (365 o versione unica) dal Sito Microsoft Windows 365 VideoLAN VLC Video Player Pagina di Download di VLC Pix Resizer for Windows Pagina dell'autore del programma WinRAR Preleva winrar Java Runtime & Development Kit (Java SDK) Java SE Downloads NetBeans Java Runtime Editio Download Pagine Facebook Rendere Amministratore di una pagina Convertitore Immagine 2 ASCII Art PICASCII Adobe Flash Pl

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