IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Récupération données de XML vers une table MySQL


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut [SimpleXML] Récupération données de XML vers une table MySQL
    Salut à tous,
    je voudrais extraire les données d'un fichier xml et les insérer dans une table, le fichier a la forme suivante:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <?xml version="1.0" encoding="UTF-8"?> 
    - <products>
    - <product>
      <TDProductId>69567567</TDProductId> 
      <name>2 RCA mles + S-video mle + in/out, 1.5 mtre</name> 
      <description>2 RCA mles + S-video mle + in/out, 1.5 mtre</description> 
      <imageUrl>http://media.aaa.com/common/products/00/00/56/23/CO0000562384.jpg</imageUrl> 
      <productUrl>http://abc.com/click?a(1197144)p(49039)prod(69567567)</productUrl> 
      <price>24.51</price> 
      <currency>EUR</currency> 
    - <TDCategories>
    - <TDCategory>
      <id>323</id> 
      <name>Cables</name> 
      <merchantName>accessoires pour TV</merchantName> 
      </TDCategory>
      </TDCategories>
    - <fields>
    - <field>
      <name>disponibilite</name> 
      <value>en stock, envoi immdiat</value> 
      </field>
    - <field>
      <name>port</name> 
      <value>4.70</value> 
      </field>
    - <field>
      <name>reference</name> 
      <value>42021</value> 
      </field>
    - <field>
      <name>marque</name> 
      <value>Metr</value> 
      </field>
    - <field>
      <name>nb commentaire</name> 
      <value>0</value> 
      </field>
      </fields>
      </product>
      </products>


    Mon problème c'est que je n'arrive à insérer dans la table que les premiers champs avant la balise <fields>, et juste aprés, à chaque fois que je met name et value pour chaque field, le code ne m'insére que le premier field uniquement, dans tous les champs restant de la table.


    voilà mon code, et merci de m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php
     
     
             $bdd = "base"; 
             $host= "localhost"; 
             $user= "root"; 
             $pass= ""; 
     
             @mysql_connect($host,$user,$pass) or die("Impossible de se connecter à la base de données"); 
             @mysql_select_db($bdd); 
     
    function lit_xml($fichier,$item,$champs) {
     
       if($chaine = @implode("",@file($fichier))) {
     
          $tmp = preg_split("/<\/?".$item.">/",$chaine);
     
          for($i=1;$i<sizeof($tmp)-1;$i+=2)
     
             foreach($champs as $champ) {
                $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
     
                $tmp3[$i-1][] = @$tmp2[1];
             }
     
     
       }
       return $tmp3;
    } 
     
    $adresse="flux.xml";
     
    $dstName="nouveau.xml";
     
    function uncompress($adresse, $dstName) {
    $string = implode("", gzfile($adresse));
    $fp1 = fopen($dstName, "w");
    fwrite($fp1, $string, strlen($string));
    fclose($fp1);
    }  
    uncompress("$adresse","$dstName");
     
    $fn=fopen($dstName,"r");
     
     
    $xml = lit_xml("nouveau.xml","product",array("TDProductId","name","description","imageUrl","productUrl","price","currency","id","name","merchantName","name","value","name","value","name","value","name","value"));
     
     
    foreach($xml as $row) {
     
             $id_produit_marchand = $row[0]; 
             $url_fiche_produit = $row[4];
    		 $url_image = $row[3];
    		 $prix_ttc = $row[5];
    		 $description = $row[2];     
    		 $nom_du_marchand = $row[9]; 
             $categorie = $row[7];
    		 $disponibilite = $row[11];
     
     
    		$frais_port_ttc = $row[13];
    		$marque = $row[15];
    	    $reference_constructeur = $row[17];
     
     
     
     
    $query= "INSERT INTO table values('" . addslashes($nom_du_marchand) . "','" . addslashes($id_produit_marchand) . "', '" . addslashes($categorie) . "', '" . addslashes($libelle) . "', '" . addslashes($url_fiche_produit) . "', '" . addslashes($url_image) . "', '" . addslashes($prix_ttc) . "', '" . addslashes($ecotaxe_ttc) . "', '" . addslashes($frais_port_ttc) . "', '" . addslashes($disponibilite) . "', '" . addslashes($ean) . "', '" . addslashes($reference_constructeur) . "', '" . addslashes($description) . "', '" . addslashes($marque) . "', '" . addslashes($garantie) . "', '" . addslashes(date("Y-m-d H:i:s")) . "', '" . addslashes($date_time_modification) . "', '" . addslashes("1") . "')";
     
    		 $result= MYSQL_QUERY($query); 
     
    }	
     
    		 if(mysql_error())
              {
               print "Erreur dans la base de données : ".mysql_error();
               print "<br>Importation stoppée.";
               exit();
              } 	
     
         MYSQL_CLOSE();    
     
    ?>

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    Quelles sont tes contraintes techniques ?
    Parceque bon, là tu as fait un parser XML avec des preg_split( ) & cie, doit sûrement y avoir une erreur qque part.
    De plus il y a bcp de @ qui cachent ces éventuelles erreurs. Il faut absolument les enlever !!

    Une API comme SimpleXML te permettra de lire facilement ton document XML et de l'exploiter à ta guise : http://www.php.net/simplexml

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2007
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Séb.
    Quelles sont tes contraintes techniques ?
    Parceque bon, là tu as fait un parser XML avec des preg_split( ) & cie, doit sûrement y avoir une erreur qque part.
    De plus il y a bcp de @ qui cachent ces éventuelles erreurs. Il faut absolument les enlever !!

    Une API comme SimpleXML te permettra de lire facilement ton document XML et de l'exploiter à ta guise : http://www.php.net/simplexml


    Merci bcp pour la réponse , mais en fait avec simplexml, je pense qu'il faut que le fichier xml soit inclu dans une page php, or moi je dois le récupérer à partir d'une url ex: http://aaaa.com/bbb.xml, donc je ne pense pas que ça sera évident de faire ça, en plus c'est un fichier de 25 méga minimum, donc je vais surement perdre bcp de temps en le téléchargeant, surtout aussi que je veux faire des taches automatisées

  4. #4
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Nottez que si le fichier xml fait plus de 50 ou 100 Megs, c'est plutot xmlReader qu'il faut utiliser puisqu'il lit le xml tel un flux : performances incomparables !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2003
    Messages : 79
    Points : 89
    Points
    89
    Par défaut
    bonjour,

    C'est typique comme résultat quand on ne boucle pas dans un sous sous noeud, ici fields contient plusieurs field; je suis certains que tu aurais le même problème si dans ton noeud <TDCategories>tu aurais plusieurs <TDCategory>;

    Ce qui n'est pas visible dans ton exemple.

    Personnellement j'aurai fait une table pour tout sous noeud qui contient n-élément.

    Ou bien je me trompe et je ne comprend pas ce que tu veux faire, dans ce cas sorry :-)

Discussions similaires

  1. Import de fichiers XML vers une table
    Par Emile87 dans le forum Oracle
    Réponses: 3
    Dernier message: 29/02/2012, 17h40
  2. Export d'un XML vers une table
    Par haskouse dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 06/10/2010, 12h30
  3. [SimpleXML] Importer un flux XML dans une table
    Par antitrust56 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 26/09/2008, 19h10
  4. [MySQL] Problème pour insérer les données d'un fichier texte vers une table Mysql !
    Par BARRIAU76 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/01/2008, 23h24
  5. Réponses: 2
    Dernier message: 19/04/2007, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo