Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 29/08/2011, 20h46   #1
Membre du Club
 
Inscription : février 2009
Messages : 150
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 150
Points : 51
Points : 51
Par défaut Parsage xml en évenementiel : comment récupérer le nom de la balise dans xml_set_character_data_handler() ?

Bonjour,

j'essaye actuellement de parser un fichier xml en évenementiel avec php.

Voici par exemple (faisons simple) le contenu du fichier xml nommé fichier.xml :

Code :
1
2
3
4
5
6
 
<racine>
   <id_ville>1</id_ville>
   <nom>Paris</nom>
   <codePostal>75001</codePostal>
</racine>

Pour parser ce fichier, càd récupérer les noms des balises (racine, id_ville, nom, codePostal) et les données des balises (1, Paris, 75001), voici mon script tout simple :

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
 
$file = "fichier.xml";
 
function recuperer_nom_balise_ouvrante($parseur, $nom_balise_ouvrante, $array_attributs) 
{
 
    echo"<br>Nom de la balise ouvrante : ".$nom_balise_ouvrante
}
 
 
function recuperer_donnee_entre_les_balises($parseur, $donnee) 
{
    echo"<br>Donnée entre les balises : ".$donnee;
}
 
 
function recuperer_nom_balise_fermante($parseur, $nom_balise_fermante) 
{  	
	echo"<br>Nom de la balise fermante : ".$nom_balise_fermante;	
}
 
 
/*On crée le parseur xml :*/
$parseur = xml_parser_create();
 
/*Les gestionnaires d'événement :*/
xml_set_element_handler($parseur, "recuperer_nom_balise_ouvrante", "recuperer_nom_balise_fermante");
xml_set_character_data_handler($parseur, "recuperer_donnee_entre_les_balises");
 
 
/*On ouvre le fichier xml à parser :*/
if (!($fp = fopen($file, "r"))) {
    die("could not open XML input");
}
 
 
/*On parse :*/
while($data_fichier = fread($fp, 4096)) 
{	
    if (!xml_parse($parseur, $data_fichier, feof($fp))) 
	{
        die(sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($parseur)), xml_get_current_line_number($parseur)));
    }
 
}

De plus j'ai une table mysql nommée ville dont les colonnes ont les memes noms que les noms des balises ouvrantes du fichier xml, à savoir :

ville
---------
id (auto-increment)
nom (varchar)
codePostal (int)


Et moi ce que je veux c'est de mettre un bout de code qui manque au script et qui permet d'insérer la donnée dans la bonne colonne de la table ville en fonction du nom de la balise ouvrante, du genre :
si le nom de la balise ouvrante est égal à id, alors la donnée qui se trouve entre les balises <id></id> sera enregistré dans la colonne id de la table ville,
sinon si le nom de la balise ouvrante est égal à nom, alors la donnée qui se trouve entre les balises <nom></nom> sera enregistré dans la colonne nom de la table ville.

Mais je ne sais pas comment l'intégrer dans le script.

Avez-vous une idée ?

Merci d'avance, cordialement.
totoAussi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 09h11   #2
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
Si tu veux pouvoir traiter tes requêtes SQL en étant sûr de bien avoir parser tes balises et ta valeur, tu peux peut-être ajouter des variables ou un tableau avec une portée globale (le mal !) afin de remplir tout ça à chaque itération de ton while()...
Tu pourras ensuite faire tes requêtes si xml_parse() fonctionne...
Sinon, ton problème peut se résoudre assez facilement sans utiliser les handlers et plus proprement qu'avec des globals ou aussi en passant par la POO...
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 10h01   #3
Modérateur
 
Inscription : septembre 2010
Messages : 7 116
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 116
Points : 8 465
Points : 8 465
utilise SimpleXML ça sera plus ... simple
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 14h39   #4
Membre du Club
 
Inscription : février 2009
Messages : 150
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 150
Points : 51
Points : 51
Bonjour

et merci pour vos réponse.

Pour simpleXML, je l'ai déjà essayé, mais ça n'a pas marché sur les fichiers xml volumineux (car mon fichier xml fait 12 Go). En effet simpleXML stocke d'abord toutes les données du fichier xml dans une variable avant de parser. Et si la RAM n'est pas suffisante (cad si RAM inférieur à 12 Go de fichier xml), alors le processus de chargement du fichier xml est interrompu.
C'est pour cette raison que j'utilise le parsage événementiel et non le parsage DOM.

Quand à la solution de Alcid__, je ne vois pas comment, à moins que vous avez des exemples .

Une idée ?

Merci d'avance, cordialement.
totoAussi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2011, 14h56   #5
Modérateur
 
Inscription : septembre 2010
Messages : 7 116
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 116
Points : 8 465
Points : 8 465
je comprend mieux, en stream c'est meiurs de faire du SAX, par contre tu peux mélangé les deux, SAX + SimpleXML, quand tu récupères ta "portion" tu la met dans un objet SimpleXML
__________________
http://blog.stealth35.com/
stealth35 est actuellement 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 14h49.


 
 
 
 
Partenaires

Hébergement Web