IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Parsage xml en évenementiel : comment récupérer le nom de la balise dans xml_set_character_data_handler() ?


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre régulier Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Points : 114
    Points
    114
    Par défaut
    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...

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    utilise SimpleXML ça sera plus ... simple

  4. #4
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    204
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 204
    Points : 123
    Points
    123
    Par défaut
    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.

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

Discussions similaires

  1. Comment récupérer le nom d'une balise XML avec DOM ?
    Par Predatorus26 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 28/05/2010, 15h54
  2. comment récupérer le nom d'une combobox dans une servlet
    Par phenix1988 dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 09/05/2010, 13h20
  3. Réponses: 2
    Dernier message: 01/04/2009, 13h54
  4. Comment récupérer le nom de la cellule dans une plage
    Par DubDub dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/03/2009, 12h26
  5. Comment récupérer le nom d'un attribut XML ?
    Par mappy dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/08/2007, 17h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo