Parser un xml ( durée du traitement )

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Parser un xml ( durée du traitement )

Message le Ven Juil 04, 2008 13:03

Bonjour,

J'essaye de parser actuellement un catalogue de produits dont le xml ressemble à cela puis j'insére le contenu en Base de donnée mysql.

Code: Tout sélectionner
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<products>
<product>
  <id>896292</id>
  <name>nom</name>
  <manufacturer>marque</manufacturer>
  <manufacturer-id>22</manufacturer-id>
  <description>description</description>

  <category>category</category>
  <category-id>2</category-id>
  <number-of-retailers>16</number-of-retailers>
  <image-url height="108" width="150">image-url</image-url>
  <rating type="professional">

    <average>4,1</average>
    <num-ratings>8</num-ratings>
  </rating>
  <lowest-price currency="EUR"prix bas</lowest-price>
  <highest-price currency="EUR">prix-haut</highest-price>
  <properties>
    <group>

      <name>Caractéristiques du produit</name>
      <property>
        <id>3916</id>
        <name>caract1</name>
        <value>valeur</value>
      </property>
    </group>

    <group>
      <name>nom</name>
      <property>
        <id>13</id>
        <name>Type </name>
        <value>valeur</value>
      </property>

    </group>
 
  </properties>
  <retailer>
    <id>27907</id>

    <name>nom1</name>
    <link>lien</link>
    <logo height="50" width="150">image logo</logo>
    <stock-info>Disponible en stock</stock-info>

    <price currency="EUR">prix</price>
    <source-type>www</source-type>
    <source-date>2008-07-04</source-date>
    <price-with-shipping-min currency="EUR">prix1</price-with-shipping-min>
    <price-with-shipping-max currency="EUR">prix2</price-with-shipping-max>
  </retailer>

<retailer>
    <id>27800</id>

    <name>nom2</name>
    <link>lien2</link>
    <logo height="50" width="150">image2 logo</logo>
    <stock-info>Disponible en stock</stock-info>

    <price currency="EUR">prix2</price>
    <source-type>www</source-type>
    <source-date>2008-07-04</source-date>
    <price-with-shipping-min currency="EUR">prix1bis</price-with-shipping-min>
    <price-with-shipping-max currency="EUR">prix2bis</price-with-shipping-max>
  </retailer>

</product>
</products>


Après plusieurs essais je suis arrivé à une solution qui fonctionne mais qui me parait très lourde en effet lorsque je parse un fichier contenant au alentour de 800 produits ( fichier 4 Mo environ ), j'arrive à une exécution du script de pres de 45s. ( sachant que j'ai plusieurs fichiers de cette taille à traiter: on se rend bien compte que je vais avoir un problème de charge...)
Dans le script ci-dessous. Mon principe et d'enregistrer dans un tableau toutes les données d'un produit. Une fois la balise de fermeture du produit atteinte j'enregistre le contenu du tableau en bdd.
Ensuite je réinitialise le tableau et je recommence pour le produit suivant et ainsi de suite...
Mon but actuellement et d'optimiser ce code et d'accélérer l'exécution.
Mais la j'ai trop réfléchi, je suis à court d'idées. :? Ou alors il va falloir que je trouve une autre méthode.




Code: Tout sélectionner
<?php
     @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");

$profondeur = array(); // profondeur des items
$tableau = array(); // tableau pour l'enregistrement des contenus

$fichier = "test.xml"; // fichier xml

// *********************************************************** DEBUT BALISE OUVRANTE *******************************************************************************************
    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
     
      global $profondeur;
      global $fin_produit;
     global $tableau;
     
      $profondeur[$parseur]++;
 
        // Si on rencontre la balise PRODUCT  ( nouveau produit) , on réinitialise le tableau
        if ($derniereBaliseRencontree=="PRODUCT")
               {
               $tableau = array(); // vide le tableau
               $id_categorie="";
               $categorie="";
               $id_produit="";
               $produit="";
               $marque="";
               $description="";
               $image="";
               $nombre_marchands="";
               $tarif_moins="";
               $tarif_plus="";

               }
    
    
      // detection fin presentation produit 
   if ($derniereBaliseRencontree=="PROPERTIES") {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]="fin_produit";}
    
     
      }// Fin fonction balise ouvrante
   
// *********************************************************** FIN BALISE OUVRANTE *******************************************************************************************   
   
   
   
   
   
   
   
// *********************************************************** DEBUT BALISE FERMANTE *******************************************************************************************
    function fonctionBaliseFermante($parseur, $nomBalise)
      {
        // On oublie la dernière balise rencontrée
        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";

      global $profondeur;
      global $tableau;
      global $balisefermante;
    
     $balisefermante=$nomBalise;
    
     // recherche marchand
   
   if ($balisefermante=="RETAILER") {$tableau[][$profondeur[$parseur]][$balisefermante]="fin_marchand";}// fin marchand
   if ($balisefermante=="PROPERTY") {$tableau[][$profondeur[$parseur]][$balisefermante]="fin_propriete";} // Fin propriétés
    
    if ($balisefermante=="PRODUCT") // détection fin de produit et enregistrement en BDD
               {
                        
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)
         {                
               
         if (($tableau[$i]['3']['CATEGORY-ID'])!="") {$id_categorie = $tableau[$i]['3']['CATEGORY-ID']; }
         if (($tableau[$i]['3']['CATEGORY'])!="") {$categorie = $tableau[$i]['3']['CATEGORY']; }
         if (($tableau[$i]['3']['ID'])!="") {$id_produit = $tableau[$i]['3']['ID']; }
         if (($tableau[$i]['3']['NAME'])!="") {$produit =$tableau[$i]['3']['NAME']; }
         if (($tableau[$i]['3']['MANUFACTURER'])!="") {$marque = $tableau[$i]['3']['MANUFACTURER']; }
         if (($tableau[$i]['3']['DESCRIPTION'])!="") {$description = $tableau[$i]['3']['DESCRIPTION']; }
         if (($tableau[$i]['3']['IMAGE-URL'])!="") {$image = $tableau[$i]['3']['IMAGE-URL']; }
         if (($tableau[$i]['3']['NUMBER-OF-RETAILERS'])!="") {$nombre_marchands = $tableau[$i]['3']['NUMBER-OF-RETAILERS']; }
         if (($tableau[$i]['3']['LOWEST-PRICE'])!="") {$tarif_moins = $tableau[$i]['3']['LOWEST-PRICE']; }
         if (($tableau[$i]['3']['HIGHEST-PRICE'])!="") {$tarif_plus = $tableau[$i]['3']['HIGHEST-PRICE'];}   
         
         
         
         
         if (($tableau[$i]['6']['NAME'])!="") {$caracteristique=$tableau[$i]['6']['NAME'];}
         if (($tableau[$i]['6']['VALUE'])!="") {$valeur_caracteristique=$tableau[$i]['6']['VALUE'];}



         if (($tableau[$i]['4']['NAME'])!="") { $marchand = $tableau[$i]['4']['NAME'];  }
         if (($tableau[$i]['4']['LINK'])!="") { $lien = $tableau[$i]['4']['LINK'];  }
         if (($tableau[$i]['4']['LOGO'])!="") { $logo = $tableau[$i]['4']['LOGO'];  }
         if (($tableau[$i]['4']['STOCK-INFO'])!="") { $stock = $tableau[$i]['4']['STOCK-INFO'];  }
         if (($tableau[$i]['4']['PRICE'])!="") { $prix= $tableau[$i]['4']['PRICE'];  }
         if (($tableau[$i]['4']['PRICE-WITH-SHIPPING-MIN'])!="") { $prix_avec_frais = $tableau[$i]['4']['PRICE-WITH-SHIPPING-MIN']; }


//*********************************************************************************************** enregistrement des produits   
         if (($tableau[$i]['3']['PROPERTIES'])=="fin_produit")
               {
               $table="table1";
            $query = 'INSERT INTO `'.$table.'` (`id_categorie`,`categorie`,`id_produit`,`produit`,`marque`,`description`,`image`,`nombre_marchands`,`tarif_moins`,`tarif_plus`) VALUES (\''.$id_categorie.'\', \''.$categorie.'\', \''.$id_produit.'\', \''.$produit.'\', \''.$marque.'\', \''.$description.'\', \''.$image.'\', \''.$nombre_marchands.'\', \''.$tarif_moins.'\', \''.$tarif_plus.'\');';
            $result = mysql_query($query);
               }

         
//**********************************************************************************enregistrement des caractéristiques des produits   
            if (($tableau[$i]['5']['PROPERTY'])=="fin_propriete")
                        {
                        $table="table2";
                        $query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$caracteristique.'\', \''.$valeur_caracteristique.'\');';
                        $result = mysql_query($query);
                        $caracteristique="";$valeur_caracteristique="";
                        }
         
         
//*****************************************************************************enregistrement des caractéristiques des marchands         
            if (($tableau[$i]['3']['RETAILER'])=="fin_marchand")
                     {    
                     $table="table3";
                     $query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$marchand.'\', \''.$lien.'\', \''.$logo.'\', \''.$stock.'\', \''.$prix.'\', \''.$prix_avec_frais.'\');';
                     $result = mysql_query($query);
                     $marchand="";$lien="";$logo="";$stock="";$prix="";$prix_avec_frais="";
                     }
               
         } // FIN boucle for
      
               
         
               }//FIN produit

      $profondeur[$parseur]--;

     
      }//FIN balise fermante
// *********************************************************** FIN BALISE FERMANTE *******************************************************************************************
    
    
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;
      global $tableau;

if (($derniereBaliseRencontree=="ID")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }      
if (($derniereBaliseRencontree=="NAME")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="MANUFACTURER")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="DESCRIPTION")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="CATEGORY")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="CATEGORY-ID")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }      
if (($derniereBaliseRencontree=="NUMBER-OF-RETAILERS")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="IMAGE-URL")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="LOWEST-PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="HIGHEST-PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }

if (($derniereBaliseRencontree=="VALUE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }
if (($derniereBaliseRencontree=="LINK")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="LOGO")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="STOCK-INFO")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="PRICE")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte;  }
if (($derniereBaliseRencontree=="PRICE-WITH-SHIPPING-MIN")) {$tableau[][$profondeur[$parseur]][$derniereBaliseRencontree]=$texte; }


         
    }

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {

        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);

//*********************************************


mysql_close();   

?>


Merci pour votre aide , j'en ai bien besoin :D
Dernière édition par seabird le Dim Juil 06, 2008 0:33, édité 1 fois.


e-kiwi
Modérateur
Modérateur
 
Messages: 13818
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juil 04, 2008 13:07

euh, pourquoi ne pas utiliser les fonctions toutes faite ? faire un DOMelement ? ou utiliser simpleXML ?

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 13:10

Pour simplexml , je suis encore en php4 :?

Qu'est ce qui est le plus rapide en traitement ?


e-kiwi
Modérateur
Modérateur
 
Messages: 13818
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juil 04, 2008 13:16

dom marche à partir de quelle version ?

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 13:21

A ça je ne sais pas . Je l'ai vu passer plusieurs fois mais pour l'instant je ne m'y suis pas intéressé. Surement à tord peut-être ..

Apparemment Domxml existe en php4


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Juil 04, 2008 14:20

combien de temps dure ton script si tu mets en commentaires les insert ?

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 15:11

julienr a écrit:combien de temps dure ton script si tu mets en commentaires les insert ?


Je viens de faire le test en supprimant tout ce qui concerne la base de donnée.
Il est toujours aussi long :(


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Juil 04, 2008 15:31

bon, c'est vrai que le code est compliqué à relire, après plusieurs minutes d'effort, je comprend pas la logique du $tableau[]
mais bon je me dis que cela ne peux venir que de cette boucle (pour peux que cela soit mal nettoyé)
Code: Tout sélectionner
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)

peut etre rajouter une trace pour etre sur que sizeof($tableau) n'est pas exponentiel...
tu lances ce script sur quel config système ?

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 15:51

julienr a écrit:bon, c'est vrai que le code est compliqué à relire, après plusieurs minutes d'effort, je comprend pas la logique du $tableau[]
mais bon je me dis que cela ne peux venir que de cette boucle (pour peux que cela soit mal nettoyé)
Code: Tout sélectionner
// Bouclage sur tous les éléments du tableau
for($i=0;$i<sizeof($tableau);$i+=1)

peut etre rajouter une trace pour etre sur que sizeof($tableau) n'est pas exponentiel...
tu lances ce script sur quel config système ?


Merci d'essayer de prendre le temps de me relire :?
En fait j'ai mis le tableau , à cause de l'insertion en base de donnée pour que tous les éléments d'un produit soient sur une même ligne. Mais peut -être que l'on peut faire autrement
Pour le sizeof($tableau). Je viens d'afficher les tailles des tableaux pour 100 produits par exemple. Et c'est vrai que toutes ces boucles cela doit être long. Voila ce que j'ai obtenu.
Code: Tout sélectionner
243
274
272
306
106
179
155
300
153
275
164
218
324
236
284
226
220
183
333
268
245
233
292
219
265
161
239
271
121
168
115
283
175
171
278
273
171
163
276
341
291
156
325
282
170
340
227
228
249
199
253
291
227
151
144
183
213
144
261
205
210
286
221
143
166
202
253
239
192
142
147
145
209
176
139
156
150
242
229
187
226
139
199
122
178
172
160
162
152
258
115
158
103
311
211
169
140
150
286
128


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Juil 04, 2008 15:58

oui bah la c claire faut trouver une façon de se passer de cette structuration en $tableau[]

en moyenne tu fais 200 itérations par produits soit 200 * 800 produits * ~15 tests/affectations ...

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 16:08

je vais essayer de voir comment me passer de tableau . Mais c'est pas gagné :?

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Ven Juil 04, 2008 16:57

En fait je n'aurais pas trop de problème s'il y avait des balises de nom différents pour une caractéristique donnée.
Mais ici en plus du nom de la balise, il faut que je teste également la profondeur.
Pour bien faire , il faudrait que je rentre les données dans la base au fur et à mesure que je parcours le flux.
On va essayer .....


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Mar Aoû 05, 2003 14:49

Message le Ven Juil 04, 2008 17:02

Ici la profondeur ne veux trop rien dire, à ta place je maintiendrais à jour le chemin courant en empilant dépilant les balises, et pour stocker les ID's identiques tu préfixes par le chemin

seabird
WRInaute impliqué
WRInaute impliqué
 
Messages: 252
Inscription: Lun Déc 01, 2003 17:57

Message le Sam Juil 05, 2008 1:32

Bon ça y est j'ai recodé sans utiliser de tableau et de boucle. Ca marche mais c'est toujours aussi long pfffff. Il met exactement 1min 30 pour 900 produits.
Par contre ce qui est bizarre , c'est que je n'ai plus le message:
" Maximum execution time of 30 seconds exceeded ". Le script continu au-dela de 30 s sans problème.
J'ai remarqué aussi que malgré
Code: Tout sélectionner
@ignore_user_abort(false);
le script continu même si je ferme le navigateur ??

Sinon voici le nouveau code:
Code: Tout sélectionner
<?php

@ignore_user_abort(false);

include 'bdd.php';

     @mysql_connect($host,$user,$pass)
      or die("Impossible de se connecter");
   @mysql_select_db("$bdd")
       or die("Impossible de se connecter");


$profondeur = array(); // profondeur des items

$fichier = "fichier.xml";

// *********************************************************** BALISE OUVRANTE *******************************************************************************************
    function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
      {

        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = $nomBalise;
     
      global $profondeur;
   
     
      $profondeur[$parseur]++;

      }// Fin fonction balise ouvrante
   
 
// *********************************************************** BALISE FERMANTE *******************************************************************************************
    function fonctionBaliseFermante($parseur, $nomBalise)
      {
        // On oublie la dernière balise rencontrée
        global $derniereBaliseRencontree;
        $derniereBaliseRencontree = "";

      global $profondeur;
   
      global $balisefermante;
    
     $balisefermante=$nomBalise;
    
      if ($balisefermante=="PRODUCTS") {exit;}

      $profondeur[$parseur]--;


     
      }//FIN balise fermante

    
    
    function fonctionTexte($parseur, $texte)
    {
        global $derniereBaliseRencontree;
        global $profondeur;
      global $id_produit;
      global $id_categorie;
      global $caracteristique;
      global $marchand;
      global $lien;
      global $logo;
      global $stock;
      global $prix;
      


if (($derniereBaliseRencontree=="ID") && $profondeur[$parseur]==3) {
            $table="table1";
            $id_produit=$texte;
            $query = 'INSERT INTO `'.$table.'` (`id_produit`) VALUES ( \''.$texte.'\')';
            $result = mysql_query($query);


}      
if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==3) {

            $table="table1";
            
            $query = "UPDATE $table SET produit='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);

}
if (($derniereBaliseRencontree=="MANUFACTURER") && $profondeur[$parseur]==3) {
            $table="table1";
            $query = "UPDATE $table SET marque='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);





  }
if (($derniereBaliseRencontree=="DESCRIPTION") && $profondeur[$parseur]==3) {

            $table="table1";
            $query = "UPDATE $table SET description='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);


}
if (($derniereBaliseRencontree=="CATEGORY") && $profondeur[$parseur]==3) {
            $table="table1";
            $query = "UPDATE $table SET categorie='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);



}
if (($derniereBaliseRencontree=="CATEGORY-ID") && $profondeur[$parseur]==3) {

            $table="table1";
            $id_categorie=$texte;
            $query = "UPDATE $table SET id_categorie='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);


}      
if (($derniereBaliseRencontree=="NUMBER-OF-RETAILERS") && $profondeur[$parseur]==3) {

            $table="table1";
            $query = "UPDATE $table SET nombre_marchands='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);


}
if (($derniereBaliseRencontree=="IMAGE-URL") && $profondeur[$parseur]==3) {

            $table="table1";
            $query = "UPDATE $table SET image='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);



}
if (($derniereBaliseRencontree=="LOWEST-PRICE") && $profondeur[$parseur]==3) {

            $table="table1";
            $query = "UPDATE $table SET tarif_moins='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);


}
if (($derniereBaliseRencontree=="HIGHEST-PRICE") && $profondeur[$parseur]==3) {

            $table="table1";
            $query = "UPDATE $table SET tarif_plus='$texte' where id_produit = '$id_produit' ";
            $result = mysql_query($query);




  }
 
// ********************************************************  ECRITURE CARACTERISTIQUES **************************************************************************
 
if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==6) {
                        $table="table2";
                        $caracteristique=$texte;
                  

}
 

if (($derniereBaliseRencontree=="VALUE") && $profondeur[$parseur]==6) {
                        $table="table2";
                        $query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`caracteristique`,`valeur_caracteristique`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$caracteristique.'\', \''.$texte.'\');';
                        $result = mysql_query($query);



}


//********************************************* ECRITURE MARCHANDS *******************************************************************************

if (($derniereBaliseRencontree=="NAME") && $profondeur[$parseur]==4) {

                     $table="table3";
                     $marchand=$texte;
               


}

if (($derniereBaliseRencontree=="LINK") && $profondeur[$parseur]==4) {

                     $table="table3";
                     $lien=$texte;
            



}
if (($derniereBaliseRencontree=="LOGO") && $profondeur[$parseur]==4) {

                     $table="table3";
                     $logo=$texte;
                     


}
if (($derniereBaliseRencontree=="STOCK-INFO") && $profondeur[$parseur]==4) {
                     $table="table3";
                     $stock=$texte;
                     



}
if (($derniereBaliseRencontree=="PRICE") && $profondeur[$parseur]==4) {
                     $table="table3";
                     $prix=$texte;
               



  }

if (($derniereBaliseRencontree=="PRICE-WITH-SHIPPING-MIN") && $profondeur[$parseur]==4) {
                     $table="table3";
                     
                     $query = 'INSERT INTO `'.$table.'` (`id_produit`,`id_categorie`,`marchand`,`lien`,`logo`,`stock`,`prix`,`prix_frais_port`) VALUES (\''.$id_produit.'\', \''.$id_categorie.'\', \''.$marchand.'\', \''.$lien.'\', \''.$logo.'\', \''.$stock.'\', \''.$prix.'\', \''.$texte.'\');';
                     $result = mysql_query($query);


}



         
    } // fin fonctioTexte

    // Création du parseur XML
    $parseurXML = xml_parser_create();

    xml_set_element_handler($parseurXML, "fonctionBaliseOuvrante", "fonctionBaliseFermante");

   xml_set_character_data_handler($parseurXML, "fonctionTexte");

    // Ouverture du fichier
    $fp = fopen($fichier, "r");
    if (!$fp) die("Impossible d'ouvrir le fichier XML");

    // Lecture ligne par ligne
    while ( $ligneXML = fgets($fp, 1024))
      {
   
        xml_parse($parseurXML, $ligneXML, feof($fp)) or
            die("Erreur XML");
      }
   
    xml_parser_free($parseurXML);
    fclose($fp);



      

echo "LECTURE ACCOMPLI";

mysql_close();   

?>


La j'ai épuisé mes ressources. Je ne sais plus comment faire. :?


julienr
WRInaute passionné
WRInaute passionné
 
Messages: 865
Inscription: Mar Aoû 05, 2003 14:49

Message le Sam Juil 05, 2008 8:31

oui là tu es pénalisé parce que tu fais bcp plus de requêtes. Voici la base d'un bout de code qui sera facilement modifiable pour y insérer tes requêtes :

Code: Tout sélectionner
function fonctionBaliseOuvrante($parseur, $nomBalise, $tableauAttributs)
{
   global $profondeur;
   global $tableau;
     
   array_push( $profondeur, $nomBalise );
      
   if( count($tableauAttributs) > 0 )
   {
      $path = implode( "_", $profondeur );
      foreach( $tableauAttributs as $k => $v )
      {
         $tableau[$path."_".$k] = $v;
      }
   }
}   
   
function fonctionBaliseFermante($parseur, $nomBalise)
{
   global $profondeur;
   global $tableau;

   if ($nomBalise=="PRODUCT")
   {
      print_r( $tableau );
      $tableau=array();
    }
     
     
   array_pop( $profondeur );
}   
   

function fonctionTexte($parseur, $texte)
{
   global $profondeur;
   global $tableau;

   $path = implode( "_", $profondeur );
     
   $tableau[$path] = $texte;
}



ce qui affiche :

Code: Tout sélectionner
Array
(
    [PRODUCTS] =>

    [PRODUCTS_PRODUCT] =>


    [PRODUCTS_PRODUCT_ID] => 896292
    [PRODUCTS_PRODUCT_NAME] => nom
    [PRODUCTS_PRODUCT_MANUFACTURER] => marque
    [PRODUCTS_PRODUCT_MANUFACTURER-ID] => 22
    [PRODUCTS_PRODUCT_DESCRIPTION] => description
    [PRODUCTS_PRODUCT_CATEGORY] => category
    [PRODUCTS_PRODUCT_CATEGORY-ID] => 2
    [PRODUCTS_PRODUCT_NUMBER-OF-RETAILERS] => 16
    [PRODUCTS_PRODUCT_IMAGE-URL_HEIGHT] => 108
    [PRODUCTS_PRODUCT_IMAGE-URL_WIDTH] => 150
    [PRODUCTS_PRODUCT_IMAGE-URL] => image-url
    [PRODUCTS_PRODUCT_RATING_TYPE] => professional
    [PRODUCTS_PRODUCT_RATING] =>
 
    [PRODUCTS_PRODUCT_RATING_AVERAGE] => 4,1
    [PRODUCTS_PRODUCT_RATING_NUM-RATINGS] => 8
    [PRODUCTS_PRODUCT_LOWEST-PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_LOWEST-PRICE] => prix bas
    [PRODUCTS_PRODUCT_HIGHEST-PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_HIGHEST-PRICE] => prix-haut
    [PRODUCTS_PRODUCT_PROPERTIES] =>
 
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP] =>

   
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_NAME] => nom
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY] =>
     
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_ID] => 13
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_NAME] => Type
    [PRODUCTS_PRODUCT_PROPERTIES_GROUP_PROPERTY_VALUE] => valeur
    [PRODUCTS_PRODUCT_RETAILER] =>
 
    [PRODUCTS_PRODUCT_RETAILER_ID] => 27907
    [PRODUCTS_PRODUCT_RETAILER_NAME] => nom1
    [PRODUCTS_PRODUCT_RETAILER_LINK] => lien
    [PRODUCTS_PRODUCT_RETAILER_LOGO_HEIGHT] => 50
    [PRODUCTS_PRODUCT_RETAILER_LOGO_WIDTH] => 150
    [PRODUCTS_PRODUCT_RETAILER_LOGO] => image logo
    [PRODUCTS_PRODUCT_RETAILER_STOCK-INFO] => Disponible en stock
    [PRODUCTS_PRODUCT_RETAILER_PRICE_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE] => prix
    [PRODUCTS_PRODUCT_RETAILER_SOURCE-TYPE] => www
    [PRODUCTS_PRODUCT_RETAILER_SOURCE-DATE] => 2008-07-04
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MIN] => prix1
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MAX_CURRENCY] => EUR
    [PRODUCTS_PRODUCT_RETAILER_PRICE-WITH-SHIPPING-MAX] => prix2
)


ensuite si toujours pas de perf faudra voir à changer de serveur ...

Parser un xml ( durée du traitement )

Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités