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

 C Discussion :

Parseur en C Sax


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut Parseur en C Sax
    Bonjour a tous, j'ai besoin d'un coup de main.
    Rien de bien compliquer mais je sèche néanmoins.
    J'ai fait un petit fichier xml et je souhaiterais le parser.. en c

    Je sais le faire en php mais pas en c.
    Je vous donne mon fichier xml (tout est passé en attribut, c'est normal)
    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
     
     <configuration>
                    <protocole nom="ospf">
                            <connexion type="filaire"/>
                            <routeurs nbr="6">
                                    <routeur id="A" alias="tata"/>
                                    <routeur id="B" alias="tete"/>
                                    <routeur id="C" alias="titi"/>
                                    <routeur id="D" alias="toto"/>
                                    <routeur id="E" alias="tutu"/>
                                    <routeur id="F" alias="tyty"/>
                            </routeurs>
                            <liens nbl="5">
                                    <lien src="A" dst="B" cout="3"/>
                                    <lien src="A" dst="C" cout="4"/>
                                    <lien src="C" dst="D" cout="5"/>
                                    <lien src="D" dst="E" cout="6"/>
                                    <lien src="E" dst="F" cout="7"/>
    			</liens>
    		</protocole>
    	</configuration>
    Quelqu'un peut m'expliquer la marche a suivre ?

    ps : j'ai vu le lien vers http://julp.developpez.com/c/libxml2/?page=sax
    mais j'arrive pas a l'adapter a mon xml.
    Merci infiniment

  2. #2
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Je te conseille d'utiliser la libraire Expat qui se trouve ici. Tu peux trouver un exemple d'utilisation .

    Très simple d'utilisation

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut Oups
    Pas si simple que ça ton truc...
    Personne a un exemple déjà fait que je puisse comprendre clairement ?
    Thanks

  4. #4
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Pas si simple que ça ton truc...
    Personne a un exemple déjà fait que je puisse comprendre clairement ?
    Thanks
    En fait, c'est comme php. expat est une librairie qui permet de parser un document xml en C.
    Déjà, commence par télécharger la librairie sur le site. Sur Linux, il faut faire lancer ./configure et make && make install pour l'installer.

    Tu écris ton programme.

    Les fonctions à connaitre :
    • XML_ParserCreate : cette fonction crée un nouveau parser. Cette fonction a le meme nom en php. Sauf qu'elle prend un paramètre qui est l'encodage à utiliser pour le document.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      XML_Parser XML_ParserCreate(const XML_Char*encoding) ;
      // exemple d'init
      XML_Parser p = XML_ParserCreate("utf-8");
    • XML_SetElementHandler : Cette fonction ajoute preneurs d'evt pour les débuts et fins de balise.

      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
       
       
      XML_SetElementHandler(XML_Parser p,
                            XML_StartElementHandler start,
                            XML_EndElementHandler end);
      //exemple 
      XML_SetElementHAndler(p, BaliseDebut, BaliseFin);
    • XML_SetCharacterDataHandler : Handler pour le contenu textuel des balises.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
       
      XML_SetCharacterDataHandler(XML_Parser p,
                                  XML_CharacterDataHandler charhndl);
       
      //exemple
      XML_SetCharacterDataHandler(XML_Parser p,
                                  contenu);
    • XML_Parse : pour parser ton document XML.



  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Merci de ton aide, j'attaque ça et te tiens au courant

  6. #6
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Merci de ton aide, j'attaque ça et te tiens au courant
    Inspire toi qd meme du code qui est sur le site

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Moi ce qui m'étonne vachement, c'est qu'il ne sais même pas quel fichier parser.
    J'ai pris l'exemple ici.http://www.xml.com/1999/09/expat/src/namespace.c
    et excuse moi du peu mais je vois pas de "blabla.xml" a parser.

  8. #8
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Moi ce qui m'étonne vachement, c'est qu'il ne sais même pas quel fichier parser.
    J'ai pris l'exemple ici.http://www.xml.com/1999/09/expat/src/namespace.c
    et excuse moi du peu mais je vois pas de "blabla.xml" a parser.
    Bah dans ton programme C tu peux lui passer un fichier xml en paramètre, non? Et tu le lis avec des fgets ou fread par exemple.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Dois-je te rappeler que moi et le c faisons deux ?

  10. #10
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Dois-je te rappeler que moi et le c faisons deux ?
    1ère chose : T'as installé expat?

    si oui, Je te laisse un petit exemple. Mon programme s'appelle expat. Pour le lancer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    expat <chemin_du_fichier>
    Code C : 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <expat.h>
     
    #if defined(__amigaos__) && defined(__USE_INLINE__)
    #include <proto/expat.h>
    #endif
     
    #ifdef XML_LARGE_SIZE
    #if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
    #define XML_FMT_INT_MOD "I64"
    #else
    #define XML_FMT_INT_MOD "ll"
    #endif
    #else
    #define XML_FMT_INT_MOD "l"
    #endif
     
    #define BUFFSIZE        8192
     
    char buff[BUFFSIZE];
     
    void XMLCALL debutElement (void *userdata, const char * el, const char** attr){
     int i = 0;
     
     fprintf(stdout,"[%s]={",el);
     while(*(attr + i) != NULL){
       fprintf(stdout,"%s = %s, ",attr[i],attr[i+1]);
       i+=2;
     }
     
     fprintf(stdout,"}\n");
    }
     
     
    void XMLCALL finElement(void *userdata, const char *el){
     
    }
     
     
     
    int main(int argc, char *argv[]){
     
     FILE *file;
     char *path;
     XML_Parser p;
     int taille;
     int done;
     
     if(argc != 1){
      fprintf(stderr,"Usage : expat <chemin fichier>");
      exit(1);
     }
     
     path = argv[1];
     file = fopen(path, "r");
     
    if( file == NULL){
     fprintf(stdout, "Impossible d'ouvrir le fichier\n");
     exit(1);
    }
     
     p = XML_ParserCreate(NULL);
     if( p == NULL){
      fprintf(stderr,"parser init error\n");
      exit(1);
     }
     
     XML_SetElementHandler(p,debutElement,finElement);
     
     while(done){
      taille = (int) fread(buff,1,BUFFSIZE,file);
      if(ferror(file)){
       fprintf(stderr,"fread error\n");
       exit(-1);
      }
      done = feof(file);
     
      if(XML_Parse(p,buff,taille,done) == XML_STATUS_ERROR){
       fprintf(stderr,"Error at line %" XML_FMT_INT_MOD "u:\n%s\n",XML_GetCurrentLineNumber(p),XML_ErrorString(XML_GetErrorCode(p)));
       exit(-1);
      }
     
     }
     
     XML_ParserFree(p);
     fclose(file);
     return 0;
    }

    Ce programme affiche la liste des attributs d'un élément.

    T'as à juste à adapter les fonctions debutElement et finElement pour tes besoins

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    J'ai bien installé expat, mais je vais vérifier néanmoins.

    Il y a toujours un truc qui me chagrine (oui je sais ..) Je n'appelle pas mon projet.xml ..
    Il ne sais pas quoi parser mon fichier.c la, non ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Pour verifier que j'avais bien installer expat, j'ai fait :
    sudo apt-get install expat
    Lecture des listes de paquets... Fait
    Construction de l'arbre des dépendances
    Lecture des informations d'état... Fait
    expat est déjà la plus récente version disponible.
    Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires*:
    linux-headers-2.6.27-7 linux-headers-2.6.27-7-generic
    Veuillez utiliser «*apt-get autoremove*» pour les supprimer.
    0 mis à jour, 0 nouvellement installés, 0 à enlever et 2 non mis à jour.

    Donc visiblement, c'est bon.

    Comment je fais pour executer ton programme maintenant? (je l'adapterais euhh.. On l'adaptera ensuite )

  13. #13
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -Werror -Wall -o exapt -lexpat
    Ca donne quoi?
    Si ca marche, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./exapt <ton_fichier_xml>

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Ca me donne :
    gcc -Werror -Wall -o nouveparser -lexpat
    /usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start':
    (.text+0x18): undefined reference to `main'
    collect2: ld a retourné 1 code d'état d'exécution

    Avec nouveauparser le nom de mon fichier..
    Du coup ta deuxieme ligne de commande ne marche pas.

  15. #15
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Ca me donne :
    gcc -Werror -Wall -o nouveparser -lexpat
    /usr/lib/gcc/i486-linux-gnu/4.3.2/../../../../lib/crt1.o: In function `_start':
    (.text+0x18): undefined reference to `main'
    collect2: ld a retourné 1 code d'état d'exécution

    Avec nouveauparser le nom de mon fichier..
    Du coup ta deuxieme ligne de commande ne marche pas.
    Merde, c'est normal que ca marche pas. Il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -Werror -Wall -o exapt  exapt.c -lexpat
    J'ai oublié le fichier.c. Si y'a encore d'autres erreurs, dis moi !!!

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    C'est bon ...Pour la compilation

    Maintenant pour l'execution, il me mets : ./nouveparser
    projetUsage : expat <chemin fichier>
    blabla@blabla-laptop:~/Projet$ expat /Projet/projet.xml
    bash: expat : commande introuvable

    Mon fichier est dans le meme repertoire que ton programme pourtant.

  17. #17
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    C'est bon ...Pour la compilation

    Maintenant pour l'execution, il me mets : ./nouveparser
    projetUsage : expat <chemin fichier>
    blabla@blabla-laptop:~/Projet$ expat /Projet/projet.xml
    bash: expat : commande introuvable

    Mon fichier est dans le meme repertoire que ton programme pourtant.
    Ah non non non non !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ./nouveauparser <ton_fichier_xml>

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Voila ce que j'ai essayé : (avec l'extension et sans l'extension..)

    a@bla-laptop:~/Projet$ ./nouveparser projet.xml
    Usage : expat <chemin fichier>a@bla-laptop:~/Projet$

    a@bla-laptop:~/Projet$ ./nouveparser projet
    Usage : expat <chemin fichier>a@bla-laptop:~/Projet$

    Je dois mettre les <> tu penses ?
    Ca m'etonnes :s

  19. #19
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par ririch Voir le message
    Voila ce que j'ai essayé : (avec l'extension et sans l'extension..)

    a@bla-laptop:~/Projet$ ./nouveparser projet.xml
    Usage : expat <chemin fichier>a@bla-laptop:~/Projet$

    a@bla-laptop:~/Projet$ ./nouveparser projet
    Usage : expat <chemin fichier>a@bla-laptop:~/Projet$

    Je dois mettre les <> tu penses ?
    Ca m'etonnes :s
    Non, tu fait ./nouveauparser LeCheminDeTonfichier. Le chemin de ton fichier est un paramtre passé au prog.
    Rappel : nouveauparser est un exécutable.

    Montre les résultats d'exécution stp !!

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    192
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 192
    Points : 47
    Points
    47
    Par défaut
    Donc si je bosse sur le bureau je vais mettre :

    ./nouveparser /Desktop/projet.xml ?


Discussions similaires

  1. Récupération données parseur Sax
    Par Mides dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/05/2012, 22h38
  2. Le parseur SAX et la méthode characters
    Par cool dans le forum Android
    Réponses: 5
    Dernier message: 27/08/2011, 11h28
  3. [SAX] Problème de Parseur SAX
    Par Link81 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 27/02/2009, 11h18
  4. problème avec le parseur SAX
    Par xblond dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 06/06/2006, 10h22

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