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

Signaler
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005
-
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
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

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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, '
';

}



?>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005

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 :)
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
8
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>
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005

chui désolé mais je vois vraiment pas :'(

tu peut faire un pti exemple ?
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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 '
';
}



?>
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005

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','','','','','','','','','');
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
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...
Messages postés
23
Date d'inscription
samedi 18 octobre 2003
Statut
Membre
Dernière intervention
30 juin 2005

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