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.
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.
Merci pour votre aide , j'en ai bien besoin
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:
<?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:
<?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
