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

Résolu
cs_deblok83 Messages postés 23 Date d'inscription samedi 18 octobre 2003 Statut Membre Dernière intervention 30 juin 2005 - 14 juin 2005 à 15:05
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre 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

10 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
15 juin 2005 à 10:04
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, '
';

}



?>
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 juin 2005 à 15:32
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)
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
14 juin 2005 à 15:38
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>
0
cs_deblok83 Messages postés 23 Date d'inscription samedi 18 octobre 2003 Statut Membre Dernière intervention 30 juin 2005
14 juin 2005 à 15:59
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 :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
14 juin 2005 à 16:06
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>
0
cs_deblok83 Messages postés 23 Date d'inscription samedi 18 octobre 2003 Statut Membre Dernière intervention 30 juin 2005
14 juin 2005 à 16:09
chui désolé mais je vois vraiment pas :'(

tu peut faire un pti exemple ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 juin 2005 à 16:35
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 '
';
}



?>
0
cs_deblok83 Messages postés 23 Date d'inscription samedi 18 octobre 2003 Statut Membre Dernière intervention 30 juin 2005
14 juin 2005 à 17:56
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','','','','','','','','','');
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
14 juin 2005 à 18:14
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...
0
cs_deblok83 Messages postés 23 Date d'inscription samedi 18 octobre 2003 Statut Membre Dernière intervention 30 juin 2005
14 juin 2005 à 20:04
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
0
Rejoignez-nous