Au secours : comment parser un fichier xml et inserer a la volé dans une base my [Résolu]

Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
- - Dernière réponse : malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
- 15 juin 2005 à 10:04
Bonjour,

c'est mon premier post ici alors je me permet de me presenter je suis le webmaster de deblok83.com .



j'ai un petit probleme je veux faire une rubrique "importer contact" qui prend comme un fichier un fichier XML



du genre

<?xml version="1.0" encoding="UTF-8"?>

<exportcontact>

<contact>

<nom>Toto</nom>

Titi


<numero type="tel portable"
>0633333330</numero>

</contact>



<contact>

<nom>dupont</nom>

Pierre


<numero type="tel fixe"
>04946986980</numero>

</contact>



</exportcontact>





a partir de ce fichier j'arrive a le parser en utilisant ce code php :



function ouverture ($parser, $name, $attrs){echo "$name
"; }

function fermeture ($parser, $name){echo "$name
";}

function texte ($parser, $data_text){ echo "$data_text
";}

function defaut (){return TRUE;}



$xml_parseur = xml_parser_create();





xml_set_element_handler($xml_parseur, "ouverture", "fermeture");

xml_set_character_data_handler($xml_parseur, "texte");

xml_set_default_handler($xml_parseur,"defaut");





//ouverture et lecture du fichier xml

$fp = fopen("testcontact.xml", "r") or die("

Fichier introuvable. L'analyse a ete suspendue");



while ($fdata = fread($fp, 2048)){



xml_parse($xml_parseur, $fdata, feof($fp)) or die(



sprintf("Erreur XML : %s à la ligne %d\n",



xml_error_string(xml_get_error_code($xml_parseur)),



xml_get_current_line_number($xml_parseur))



);



}



?>



mon probleme donc c'est que je sais pas comment faire pour inserer les
contacts dans ma base mysql au fure et a mesure de la lecture du
fichier xml .

Merci d'avance pour vos reponses
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
3
Merci
Bon...lol.



Fais a la va vite, sans test de verification, sans fonction ni rien, hein. Mais ca marche. A toi de l'ameliorer ;-)



<?php

function ouverture ($parser, $name, $attrs){ }

function fermeture ($parser, $name){}

function texte ($parser, $data_text){}

function defaut (){return TRUE;}



$xml_parseur = xml_parser_create();





xml_set_element_handler($xml_parseur, "ouverture", "fermeture");

xml_set_character_data_handler($xml_parseur, "texte");

xml_set_default_handler($xml_parseur,"defaut");





//ouverture et lecture du fichier xml

$fp = fopen("test.xml", "r") or die("

Fichier introuvable. L'analyse a ete suspendue");



while ($fdata = fread($fp, 2048)){



xml_parse_into_struct ($xml_parseur, $fdata, $vals) or die(



sprintf("Erreur XML : %s à la ligne %d\n",



xml_error_string(xml_get_error_code($xml_parseur)),



xml_get_current_line_number($xml_parseur))



);



}

echo '';

print_r ($vals);

echo '

';

echo '

-----START QUERIES-----

';

foreach ($vals as $elem) {

if ($elem['tag'] === 'NOM')

$arrNom[] = $elem['value'];

if ($elem['tag'] === 'PRENOM')

$arrPrenom[] = $elem['value'];

if ($elem['tag'] === 'NUMERO') {

$arrNumero[] = $elem['value'];

$arrType[] = $elem['attributes']['TYPE'];

}

}



$cpt = count ($arrNom);

for ($i = 0; $i < $cpt; $i ++) {

$arrRequetes[] = 'INSERT INTO matable ("nom",
"prenom", "telephone", "type") VALUES ("'.$arrNom[$i].'",
"'.$arrPrenom[$i].'", "'.$arrNumero[$i].'", "'.$arrType[$i].'")';

}



foreach ($arrRequetes as $requete) {

echo $requete, '
';

}



?>

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 219 internautes nous ont dit merci ce mois-ci

Commenter la réponse de malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Hello,



puisque tu arrives a le parser, tu arrives donc a afficher les donnees
? Donc quel est le probleme pour les inserer dans ta base ? Visiblement
la structure est fixe : dans contact, tu as 3 elements. Bah tu inseres
tous les 3 elements ? (apres contact lol)
Commenter la réponse de malalam
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
Salut,



quelle est la structure de ta table ?


<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Commenter la réponse de cs_Anthomicro
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
0
Merci
le probleme c'est que je vois pas comment faire a quelle moment faut inserer !!



voila la structure de la table personne et l'insertion que je veu faire :

INSERT INTO personne VALUES
('$nom','$prenom','$civilite','$description','$date','$adr1','$adr2','$ville','$codepostal','$pays');



un pti exemple serai le bienvenue merci :)
Commenter la réponse de cs_deblok83
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
0
Merci
function ouverture ($parser, $name, $attrs){echo "$name
"; }

function fermeture ($parser, $name){echo "$name
";}

function texte ($parser, $data_text){ echo "$data_text
";}



Bah là tu récupères les valeurs, tu les places dans une variable
globale pour ensuite récupérer son contenu après le while par exemple.



a +

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
Commenter la réponse de cs_Anthomicro
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
0
Merci
chui désolé mais je vois vraiment pas :'(

tu peut faire un pti exemple ?
Commenter la réponse de cs_deblok83
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Hello,

tien, je te donne une piste. Je pense qu'a partir de ca tu sauras te debrouiller :

<?php
function ouverture ($parser, $name, $attrs){echo $name, '
';; }
function fermeture ($parser, $name){echo $name, '
';}
function texte ($parser, $data_text){echo $data_text, '
';}
function defaut (){return TRUE;}


$xml_parseur = xml_parser_create();



xml_set_element_handler($xml_parseur, "ouverture", "fermeture");
xml_set_character_data_handler($xml_parseur, "texte");
xml_set_default_handler($xml_parseur,"defaut");



//ouverture et lecture du fichier xml
$fp = fopen("test.xml", "r") or die("
Fichier introuvable. L'analyse a ete suspendue");


while ($fdata = fread($fp, 2048)){


xml_parse_into_struct ($xml_parseur, $fdata, $vals) or die(


sprintf("Erreur XML : %s à la ligne %d\n",


xml_error_string(xml_get_error_code($xml_parseur)),


xml_get_current_line_number($xml_parseur))


);


}
echo '';
print_r ($vals);
echo '

';
echo '---------------------------';
foreach ($vals as $valeur) {
echo $valeur['value'];
echo '
';
}



?>
Commenter la réponse de malalam
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
0
Merci
j'ai fait sa mais apparament sa fait pas ce que j'attend :'(

foreach ($vals as $valeur)

{





if ($valeur['level']=="3")

{



if
($valeur['tag']=="CIVILITE")
$civilite=$valeur['value'];
else $civilite="";

if
($valeur['tag']=="NOM")

$nom=$valeur['value'];
else $nom="";

if
($valeur['tag']=="PRENOM")
$prenom=$valeur['value'];
else $prenom="";

if
($valeur['tag']=="DESCRIPTION")
$description=$valeur['value']; else $description="";

if
($valeur['tag']=="ADR")

$adr1=$valeur['value'];
else $adr1="";

if
($valeur['tag']=="VILLE")
$ville=$valeur['value'];
else $ville="";

if
($valeur['tag']=="CODEPOSTAL")
$codepostal=$valeur['value']; else $codepostal="";

if
($valeur['tag']=="PAYS")

$pays=$valeur['value'];
else $pays="";

if
($valeur['tag']=="SOCIETE")
$societe=$valeur['value'];
else $societe="";

if
($valeur['tag']=="EMAIL")
$email=$valeur['value'];
else $email="";

if
($valeur['tag']=="NUMERO")
{$numero=$valeur['value'];
$type_comm=$valeur['attributes']['TYPE'];}
else{ $numero=""; $type_comm=""; }





$sql = "INSERT
INTO personne VALUES
('','3','".$nom."','".$prenom."','".$civilite."','','".$description."','".$date."','Nouveau','".$adr1."','".$adr2."','".$ville."','".$codepostal."','".$pays."');";

echo
"
$sql
";




}





}

sa donne sa :



INSERT INTO personne VALUES ('','3','','','Mr.','','','','','','','','');

INSERT INTO personne VALUES ('','3','toto','','','','','','','','','','');

INSERT INTO personne VALUES ('','3','','titi','','','','','','','','','');
Commenter la réponse de cs_deblok83
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17
0
Merci
Ouais, ben c'est normal lol. Ce sera un peu plus complique... ;-)

Le foreach () etait un exemple, il faudra sans doute parcourir le tableau differemment.
Parce que la, tu lis chaque entree de ton tableau...ok. En fait, pour un enregistrement XML; tu as plein d'enregiustrements dans ton tableau.
Chaque boucle de ton foreach va chercher un tableau contenant SOIT civilite, SOIT nom, SOIT prenom etc...
Donc il faut voir ou tu construits ta requete. Si tu la construits dans le foreach, tu auras une requete avec a chaque fois, uniquement 1 champ rempli, tous les autres vides. Normal, puisque a chaque tour de boucle, c'est bien ce que tu as.

Je te conseille de decouper ce tableau en plusieurs tableaux : un contenant toutes les civilites, l'autres tous les noms etc...en remplissant evidemment avec une chaine vide s'il n'y a rien histoire d'avoir le meme nombre d'entrees dans tous les tableaux.
Puis tu construits tes requetes en prenant chaque entree avec le meme index, jusqu'au dernier index.

Un truc dans le genre en tous cas.
Mais utiliser directement ce tableau va etre le bordel...
Commenter la réponse de malalam
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
0
Merci
Oui je vois ce que tu veux j'ai a peu prés compris !! mais pour l'écrire c'est autre chose

si quelqu'un à un pti exemple
Commenter la réponse de cs_deblok83