+ Rispondi alla Discussione
Risultati da 1 a 20 di 20

[Pillola] Leggere il contenuto di un file XML

Ultimo Messaggio di medmax il:
  1. #1
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572

    [Pillola] Leggere il contenuto di un file XML

    Se avete problemi a ricavare informazioni da un file XML, ecco a voi un semplice script PHP che, attraverso l'utilizzo della classe DOM, è in grado di eseguire un parsing del file XML.
    Lo script legge il file e ne crea un albero dalla quale è possibile estrapolare i nomi di un nodo, il valore associato e, se ci sono, gli attributi in esso specificati.

    Ecco il codice PHP contenente la funzione per il parsing del file XML.
    Questo è un codice proposto da Gorka (Moderatore di questo Forum), con l'aggiunta di una spiegazione del funzionameto ed di un controllo per impedire errori nell'apertura di un file XML non valido.
    Codice PHP:
    <?php
        
    //Path file XML
        
    $xml_path "file.xml";

        
    //Inizializza classe DOM
        
    $dom = new DOMDocument();
        
        
    //Non calcolare spazi vuoti nel documento
        
    $dom -> preserveWhiteSpace false;
        
        
    //Carica il file XML
        
    @$dom -> load($xml_path)
            or die(
    "File XML non valido!");

        
    //Cerca il nodo radice del codice XML
        
    $root $dom -> documentElement;
        
        
    //Controllo se il nodo radice ha figli, in caso processo l'albero XML
        
    if($root -> hasChildNodes())
        {
            
    //Funzione per l'elaborazione dell'albero XML (Nodo ROOT, Livello 0)
            
    xmltree($root0);
        }
        
        
    //Funzione xmltree, come argomenti prevede il puntatore al nodo da esaminare ed il livello del nodo
        
    function xmltree($nodo$p)
        {
            
    //Aumento livello, scendi di un nodo nell'albero
            
    $p++;

            
    //Visualizzazione grafica opzionale dei livelli ( - = 1° livello, -- = 2° livello, ecc...)
            
    $livello str_repeat("  _  "$p);

            
    //Ricava figli del nodo elaborato
            
    $figli $nodo -> childNodes;

            
    //Processa ogni figlio del nodo
            
    foreach($figli as $figlio)
            {
                
    //Riconosce il primo livello del nodo e traccia una linea grafica di demarcazione (Opzionale)
                
    if($p == 1) echo "<hr>";

                
    //Visualizza il nome del nodo e rimuovi possibili codici superflui
                
    if(substr($figlio -> nodeName01) != "#")
                {
                    echo 
    "<br><br>" $livello " NODO: " $figlio -> nodeName;
                }

                
    //Controlla se il nodo ha degli attributi
                
    if($figlio -> hasAttributes())
                {
                    
    //Cerca attributi nel nodo
                    
    $attributi $figlio -> attributes;

                    
    //Elabora attributi trovati
                    
    foreach($attributi as $attributo)
                    {
                        echo 
    " -- NOME ATTRIBUTO: " $attributo -> name " - VALORE ATTRIBUTO: " $attributo -> value;
                    }
                }

                
                
    //Controllo se il nodo elaborato ha figli e ripete iterativamente la funzione su ogni nodo fino ad arrivare alle foglie dell'albero
                
    if($figlio -> hasChildNodes())
                {
                    
    xmltree($figlio$p);
                }
                else
                {
                    
    //Visualizza il valore contenuto nel nodo
                    
    echo " -- VALORE DEL NODO: " $figlio -> nodeValue;
                }
            }
        }
    ?>
    Un possible codice contenuto nel file XML

    Codice HTML:
    <?xml version="1.0"?>
    <database>
        <utente>
            <nome>Andrea</nome>
            <user>Sups</user>
            <anno_nascita>1985</anno_nascita>
        </utente>
        <utente>
            <nome>Mario</nome>
            <cognome>De Rossi</cognome>
            <residenza via="Acaso, 15" citta="Pesaro">Italia</residenza>
        </utente>
    </database>
    Non è molto complessa come funzione
    A qualcuno può tornare utile una cosa del genere

    P.S: Nel codice XML, ogni riferimento a fatti o persone esistenti è puramente casuale!

    Ciao!
    Ultima modifica di Sups; 09-11-07 alle 18:25
    Now is the time for all good men to come to the aid of their country!

  2. #2
    Esperto L'avatar di ceccus
    Data Registrazione
    Oct 2006
    Messaggi
    921
    Ciao Sups,
    grazie della Pillola, sicuramente molto utile!

    Aspettiamo qualche feedback dai primi che la implementeranno nei loro script!

  3. #3
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572
    Ciao ceccus, speriam di ricevere feedback positivi

    Ci son tre motivi se non arriva niente:
    1) A nessuno interessa lo script (Probabile)
    2) Nessuno ha ancora provato lo script (Probabile)
    3) Il PC è imploso dopo il primo test dello script (Forse )


    Ciao!
    Now is the time for all good men to come to the aid of their country!

  4. #4
    User L'avatar di Bazzilla
    Data Registrazione
    Jul 2007
    Messaggi
    45
    Non ho ancora esigenze di lettura file xml, ma non appena ne avrò mi getterò a capofitto su questo script, quindi ringrazio anticipatamente.

  5. #5
    Esperto L'avatar di Gorka
    Data Registrazione
    Apr 2006
    Località
    Ragusa
    Messaggi
    1,681
    Testato e funziona bene (bel lavoro Sups ).

    Lancio un sasso nello stagno (ho poco tempo a disposizione): verificare se il nodo è codificato a 64bit e decodificarlo con base64_decode(nodo)

  6. #6
    Banned L'avatar di Napster
    Data Registrazione
    Nov 2006
    Località
    Roma!
    Messaggi
    732
    Per Leggere il documento xml in modalità SAX?

    PS: Per scrivere su un file xml?

  7. #7
    User
    Data Registrazione
    Nov 2007
    Messaggi
    35
    Questa cosa capita proprio a fagiolo!!!

    Stavo cercando proprio oggi di realizzare un progetto in cui avevo bisogno dell'XML,ma il mio primo problema è questo:

    Warning: domdocument::domdocument() expects at least 1 parameter, 0 given in

    la riga a cui si riferisce è : $dom = new DOMDocument();

    Perchè?

    P.S. Ho già abilitato l'estenzione necessaria!

  8. #8
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572
    Citazione Originariamente Scritto da Napster Visualizza Messaggio
    Per Leggere il documento xml in modalità SAX?
    Prova questo script:

    Codice PHP:
    <?php

    # Esempio d'uso:
    #
    # include ("parserXML.php");
    # $data = parse_file("example.xml");
    echo "<pre>"; print_r($data); echo "</pre>";

    $struct array();

    # Funzioni di callback

    function startElement($parser$name$attrs)
    {
    global 
    $struct;
    $tag = array("name"=>$name,"attrs"=>$attrs);
    array_push($struct,$tag);
    }

    function 
    data($parser$data)
    {
    global 
    $struct,$i;
    if(
    trim($data))
    {
    $struct[count($struct)-1]['data']=$data;
    }
    }

    function 
    endElement($parser$name)
    {
    global 
    $struct;
    $struct[count($struct)-2]['child'][] = $struct[count($struct)-1];
    array_pop($struct);
    }

    # Funzione che parsa il file passatogli nell'argomento e restituisce
    # una struttura ad albero oggetti-array contenente il documento

    function parse_file($file){

    global 
    $struct;

    $xml_parser xml_parser_create();

    xml_set_element_handler($xml_parser"startElement""endElement");
    xml_set_character_data_handler($xml_parser"data");

    $parse xml_parse($xml_parser,file_get_contents($file));

    if(!
    $parse) {
    die(
    "Errore parsing XML");
    xml_parser_free($xml_parser);
    }

    return 
    $struct;

    }
    ?>
    Ciao!
    Now is the time for all good men to come to the aid of their country!

  9. #9
    User Newbie
    Data Registrazione
    Nov 2007
    Messaggi
    3

    Problemi con script per leggere il file xml con Dom

    Ciao a tutti.
    ho provato lo script per leggere il file xml con il Dom. Ma mi da il seguemte errore;
    Fatal error: Cannot redeclare xmltree() in C:\Program Files\EasyPHP 2.0b1\www\testXml.php on line 74

    Come si può capire utilizzo la EasyPhp2.0 che utilizza la versione di Php 5.
    Come posso risolvere

    Grazie a tutti Ciao

  10. #10
    User
    Data Registrazione
    Jul 2005
    Messaggi
    187
    Ho provato lo script ma non trova la Dom, come si attiva ?

    Sto usando in locale Easyphp.

    Grazie

  11. #11
    User
    Data Registrazione
    Jul 2005
    Messaggi
    187
    Ho questo errore :

    Fatal error: Cannot instantiate non-existent class: domdocument in c:\programmi\easyphp1-7\www\xml\leggibet.php on line 6

  12. #12
    MZ
    MZ è offline
    User L'avatar di MZ
    Data Registrazione
    Jun 2005
    Località
    Lecce-Torino
    Messaggi
    514
    Ciao Dragone67,

    E' un pò di tempo che non uso easyphp, ma penso che per attivare le estensione DOM basta seguire il modello generale:

    Mi sembra di aver capito che sei su win:

    tratto da http://it2.php.net/domxml

    ""Gli utenti Windows devono abilitare php_domxml.dll dal php.ini per potere utilizzare queste funzioni. In PHP 4 this DLL resides in the extensions/ directory within the PHP Windows binaries download. La DLL per questa estensione PECL può essere scaricata dalla pagina » PHP Downloads oppure da » http://pecl4win.php.net/ Inoltre, per potere utilizzare queste funzioni, occorre che una DLL aggiuntiva sia presente nella PATH del sistema. In PHP 4 questa DLL si trova nella directory dlls/. Il suo nome: Per PHP <= 4.2.0, è libxml2.dll. Per PHP >= 4.3.0, è iconv.dll. E dal PHP 5.0.0 iconv è compilata nell'eseguibile PHP per Windows, percui non vi è più bisogno di dll aggiuntive.
    ""

    dovrebbe esserti utile..

    se poi c'è qualcuno che ha avuto esperienze dirette con easyphp aspettiamo..

  13. #13
    User
    Data Registrazione
    Nov 2007
    Località
    web/htdocs
    Messaggi
    36
    Citazione Originariamente Scritto da Sups Visualizza Messaggio
    Se avete problemi a ricavare informazioni da un file XML, ecco a voi un semplice script PHP che, attraverso l'utilizzo della classe DOM, è in grado di eseguire un parsing del file XML.
    Ciao Sups, ho provato il tuo script e funziona perfettamente. Il mio obbiettivo finale è quello di importare tutte queste informazioni dal file XML ad una tabella mysql in quanto ho un file XML generato da un programma con all'interno un elenco articoli. Questo elenco vorrei caricarlo su mysql per gestirlo con php e query.
    Puoi darmi qualche consiglio?
    ciao

  14. #14
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572
    Ciao Sark, puoi utilizzare il parser xml per leggere tutti i nodi del file XML e salvi il contenuto in una tabella realizzata con l'uso di un array multidimensionale.
    Successivamente leggi il contenuto della tabella e invii i dati al DB con apposite query.
    Oppure per limitare la complessità, appena letto il valore del nodo, lo invii direttamente al DB.

    Ciao!
    Now is the time for all good men to come to the aid of their country!

  15. #15
    User
    Data Registrazione
    Nov 2007
    Località
    web/htdocs
    Messaggi
    36
    Citazione Originariamente Scritto da Sups Visualizza Messaggio
    Ciao Sark, puoi utilizzare il parser xml per leggere tutti i nodi del file XML e salvi il contenuto in una tabella realizzata con l'uso di un array multidimensionale.
    ok direi che è fuori dalla mia portata! hai a disposizione del codice da farmi vedere o un qualche link a siti che possa studiare che trattano gli array multidimensionali?
    a livello di concetto ho capito quello che mi hai detto di fare ma non lo so scrivere in php perchè non sono esperto.
    ciao!

  16. #16
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572
    Ho creato un semplice script che legge un file XML e crea le query SQL per l'inserimento dei dati nel DB.

    Codice XML

    Codice:
    <?xml version="1.0"?>
    <database>
        <utente>
            <nome>Andrea</nome>
            <user>Sups</user>
            <anno_nascita>1985</anno_nascita>
        </utente>
        <utente>
            <nome>Mario</nome>
            <cognome>De Rossi</cognome>
            <residenza>Italia</residenza>
        </utente>
    </database>
    Per come è concepito il codice:
    <utente> = Nome della tabella
    <nome>, <cognome>, ecc... = Nome dei campi della tabella
    Andrea, Mario, ecc... = Valori da inserire nella tabella

    Il codice è questo:

    Codice PHP:
    <?php
        $xml_path 
    "file.xml";
        
        
    $i 0;
        
    $query "";
        
        
    $dom = new DOMDocument();
        
        
    $dom -> preserveWhiteSpace false;
        
        @
    $dom -> load($xml_path)
            or die(
    "File XML non valido!");
            
        
    $root $dom -> documentElement;
        
        if(@
    $root -> hasChildNodes())
        {
            
    xmltree($root0);
            
            echo 
    $query;
        }
        
        function 
    xmltree($nodo$p)
        {
            
    $p++;
            
            
    $figli $nodo -> childNodes;
            
            foreach(
    $figli as $figlio)
            {
                if(
    substr($figlio -> nodeName01) != "#")
                {
                    
    // <utente> = Nome della tabella
                    
    if($p == 1)
                    {
                        
    $GLOBALS['query'] .= "<br>INSERT INTO " $figlio -> nodeName " SET ";
                        
    $GLOBALS['i'] = 0;
                    }
                    else
                    {
                        if(
    $GLOBALS['i'] == 1)
                        {
                            
    $GLOBALS['query'] .= ", " $figlio -> nodeName " = '";
                        }
                        else
                        {
                            
    $GLOBALS['query'] .= $figlio -> nodeName " = '";
                            
    $GLOBALS['i'] = 1;
                        }
                    }
                }
                
                
    // Valori dei nodi
                
    if($figlio -> hasChildNodes())
                {
                    
    xmltree($figlio$p);
                }
                else
                {
                    
    $GLOBALS['query'] .= $figlio -> nodeValue "'";
                }
            }
        }
    ?>
    Ciao!
    Now is the time for all good men to come to the aid of their country!

  17. #17
    User
    Data Registrazione
    Nov 2007
    Località
    web/htdocs
    Messaggi
    36
    Grazie 1000 Sups!
    Ho fatto delle prove e ora riesco con il tuo script a popolare una tabella in mysql partendo da un file xml.

    non riesco però ad eseguire gli aggiornamenti.
    essendo il file xml un elenco di articoli, devo aggiornarlo spesso per poter per es modificare le quantità disponibili.

    puoi aiutarmi?

  18. #18
    Esperto L'avatar di Sups
    Data Registrazione
    May 2007
    Località
    Pesaro
    Messaggi
    572
    Citazione Originariamente Scritto da Sark Visualizza Messaggio
    non riesco però ad eseguire gli aggiornamenti.
    essendo il file xml un elenco di articoli, devo aggiornarlo spesso per poter per es modificare le quantità disponibili.
    Non ti posso rispondere perchè non conosco il tipo di relazione tra XML e l'articolo, cioè com'è strutturato quest'ultimo all'interno del file XML e come deve essere rappresentato nel DB.
    Però potresti sostituire INSERT INTO con UPDATE, la query SQL che permette l'aggiornamento di righe già esistenti.
    Now is the time for all good men to come to the aid of their country!

  19. #19
    User
    Data Registrazione
    Feb 2010
    Località
    napoli
    Messaggi
    17
    Salve,
    ho trovato lo script su internet, mi serve ma vorrei modificare una cosa... in pratica mi serve che il file xml non sia sul server dove è stato avviato lo script, ma su un altro server, come faccio a richiamarlo???

  20. #20
    User
    Data Registrazione
    Oct 2006
    Località
    Udine
    Messaggi
    83
    Grazie Sups|
    Script molto utile!!!
    Perfetto anche per il file xml remoto!!!!!

+ Rispondi alla Discussione

Tag per Questa Discussione

^ Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
  • Il codice BB è Attivato
  • Le faccine sono Attivato
  • Il codice [IMG] è Attivato
  • Il codice [VIDEO] è Attivato
  • Il codice HTML è Disattivato
  • Trackbacks Attivato
  • Pingback Attivato
  • Refback Attivato

SEO by vBSEO 3.6.0 PL2 ©2011, Crawlability, Inc.