Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di mjungle
    Registrato dal
    Mar 2002
    Messaggi
    173

    lettura file XML di grandi dimensioni con l'oggetto DOMDocument

    Ciao a tutti.
    Devo implementare una soluzione per importare nel mio database 100000 record (o più). Questi record mi vengono passati tramite un file XML ogni settimana. Vorrei gestire questa importazione tramite PHP (alla peggio passerò a perl), ma ho seri problemi di gestione.
    Per leggere il file XML utilizzo la classe DOMDocument, e il codice che uso è lo stesso suggerito nella descrizione del metodo DOMDocument::getElementsByTagName su php.net.
    Questo è il codice che uso:

    Codice PHP:
    <?php
    ini_set
    ("max_execution_time"1200); 
    ini_set("memory_limit","100M");

    echo 
    "[list=1]";
    $doc = new DOMDocument();
    $doc->load'users.xml' );
     
    $dataset $doc->getElementsByTagName"dataUser" );
    foreach( 
    $dataset as $row )
    {
        
    $xmlUserNames $row->getElementsByTagName"UserName" );
        
    $xmlUserName $xmlUserNames->item(0)->nodeValue;
     
        
    $xmlEmails $row->getElementsByTagName"Email" );
        
    $xmlEmail $xmlEmails->item(0)->nodeValue;
     
        
    $xmlDisplayNames $row->getElementsByTagName"DisplayName" );
        
    $xmlDisplayName $xmlDisplayNames->item(0)->nodeValue;
        
        
    $xmlTelephones $row->getElementsByTagName"Telephone" );
        
    $xmlTelephone $xmlTelephones->item(0)->nodeValue;
        
        
    $xmlMobiles $row->getElementsByTagName"Mobile" );
        
    $xmlMobile $xmlMobiles->item(0)->nodeValue;
        
        
    $xmlFaxes $row->getElementsByTagName"Fax" );
        
    $xmlFax $xmlFaxes->item(0)->nodeValue;
     
        echo 
    "[*]"."$xmlUserName - $xmlEmail - $xmlDisplayName - $xmlTelephone - $xmlMobile - $xmlFax"."";
    }
    echo 
    "[/list]";
    ?>
    Questo è il mio file users.xml:
    Codice PHP:
    <?xml version="1.0" encoding="UTF-8"?>
    <NewDataSet>
        <dataUser>
            <UserName>User1</UserName>
            <Email>user1@mail.com</Email>
            <Telephone>01234567</Telephone>
            <Mobile>987654321</Mobile>
            <Fax>123456789</Fax>
            <DisplayName>UserOne</DisplayName>
        </dataUser>
        <dataUser>
            <UserName>User2</UserName>
            <Email>user2@mail.eu</Email>
            <Telephone>01234567</Telephone>
            <Mobile>987654321</Mobile>
            <Fax>123456789</Fax>
            <DisplayName>UserTwo</DisplayName>
        </dataUser>
        <dataUser>
            <UserName>User3</UserName>
            <Email>user3@mail.net</Email>
            <Telephone>01234567</Telephone>
            <Mobile>987654321</Mobile>
            <Fax>123456789</Fax>
            <DisplayName>UserThree</DisplayName>
        </dataUser>
        <dataUser>
        ...
        </dataUser>
    </NewDataSet>
    Il problema qual è: la procedura è lentissima! Se aggiungo altri elementi indicativamente leggo un nodo al secondo, e più avanzo nel file più rallenta.
    Qui un esempio (il file sul quale lavoro ha 20 elementi in più a nodo).
    Come posso velocizzare la lettura dell'XML? Suppongo che il problema risieda nella memoria utilizzata.
    Grazie anticipatamente. ;-)

  2. #2

  3. #3
    Utente di HTML.it L'avatar di mjungle
    Registrato dal
    Mar 2002
    Messaggi
    173
    Ciao Filippo,
    grazie per il consiglio. Mi sono documentato un po' e ho capito le differenze sostanziali tra i sistemi SAX e DOM. Ora ho più dubbi di prima! :master:
    E' possibile secondo te, utilizzando SAX, leggere il file users.xml e inserirne ogni "dataUser" in un record di database?
    Grazie mille. ;-)

  4. #4
    Si, è possibile, richiede molta meno memoria ed è molto più veloce rispetto a DOM.

  5. #5
    Utente di HTML.it L'avatar di mjungle
    Registrato dal
    Mar 2002
    Messaggi
    173
    Avresti un link da passarmi per studiare una soluzione? Ho cercato ma ho trovato solo letture di XML, nulla che mi suggerisse lettura e inserimento. Quello che mi risulta difficile da capire è come raccogliere i valori di ogni "dataUser" per poi inserirli nel DB.
    Grazie ancora. ;-)

  6. #6
    E' piuttosto semplice.

    Ti implementi le callback del parser (es. in una classe).

    Quando si apre il tag dataUser inizializzi un array vuoto.
    Ad ogni tag aggiungi i dati che ti servono nell'array.
    Quando si chiude il tag dataUser prendi i dati dall'array, crei la query di INSERT ed esegui l'a query.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.