Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > XML > SimpleXML
SimpleXML Forum d'entraide pour l'extension SimpleXML, qui permet de manipuler des documents XML en PHP (approche DOM).
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/06/2007, 17h03   #1
Invité de passage
 
Inscription : mai 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 6
Points : 0
Points : 0
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 :
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 :
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();    
 
?>
emmma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 00h41   #2
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 827
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

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

Informations forums :
Inscription : mars 2005
Messages : 2 827
Points : 3 459
Points : 3 459
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
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 12h42   #3
Invité de passage
 
Inscription : mai 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 6
Points : 0
Points : 0
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
emmma est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2007, 13h14   #4
Inscrit
 
Avatar de is_null
 
Inscription : octobre 2006
Messages : 637
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 637
Points : 690
Points : 690
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 !
__________________
Q: Dois-je haïr et cogner sur Microsoft ?
R: Non, vous n'êtes pas obligé. Non pas que Microsoft n'est pas écoeurant, mais il y avait une culture hacker bien avant Microsoft et il y en aura une bien après que Microsoft aura été de l'histoire ancienne. Toute énergie dépensée à haïr Microsoft serait mieux employée par vos compétences et votre passion. Écrivez du bon code, cela brisera suffisamment Microsoft sans polluer votre karma.
Comment devenir un hacker ? par Eric Steven Raymond
is_null est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2007, 18h28   #5
Membre du Club
 
Inscription : mars 2003
Messages : 68
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 68
Points : 67
Points : 67
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 :-)
martel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h03.


 
 
 
 
Partenaires

Hébergement Web