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 :

[glib] parser fichier xml


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Points : 35
    Points
    35
    Par défaut [glib] parser fichier xml
    bonjour,
    j'aimerais parser un fichier xml pour recuprer les données dont j'en ai besoin.
    je veux utiliser la glib etant donné que je l'utilises deja pour autre chose donc je prefere pas utiliser la libxml2.
    mais le probleme c'est que je trouve un peu de difficulté à l'utiliser.
    pour le moment j'arrive à afficher les tags ainsi que le contenu des tags <tag> contenu </tag>.
    mais le probleme c'est que chaque callback gere quelque chose je vois pas comment faire.
    voila le code il marche.

    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
    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
    91
    92
     
    #include <glib.h>
    #include <stdio.h>
     
    void xml_start_element_handler   (
                                        GMarkupParseContext *context,
                                        const gchar               *element_name,
                                        const gchar             **attribute_names,
                                        const gchar             **attribute_values,
                                        gpointer                   user_data,
                                        GError                   **error)
    {
      g_print("- tag ouvert = %s\n", element_name);
      guint i=0;
      while(attribute_names[i] != NULL)
      {
        g_print(" attr %s = %s \n", attribute_names[i], attribute_values[i]);
        ++i;
      }
    }
     
    void xml_end_element_handler   (
             GMarkupParseContext *context,
                                        const gchar               *element_name,
                                        gpointer                   user_data,
                                        GError                   **error)
    {
         g_print("-- tag fermé = %s\n", element_name);
    }
     
    void text           (GMarkupParseContext *context,
                              const gchar         *text,
                              gsize                text_len,  
                              gpointer             user_data,
                              GError             **error)
    {
     			  g_print(" '''''' txt = %s\n", text);																							
    }
     
     
    void xml_error_handler(   GMarkupParseContext *context,GError *error, gpointer user_data)
    {
       fprintf (stderr, " %s\n", error->message);
    }
     
    gboolean create_xml(const gchar *filename)
    {
       gchar *contents = NULL;
       gsize  length;
       GError *error=NULL;
       GMarkupParseContext *context;
     
       GMarkupParser parser;
     
       parser.start_element = xml_start_element_handler;
       parser.end_element = xml_end_element_handler;
       parser.text = text;
       parser.passthrough = NULL;
       parser.error = xml_error_handler;
     
       if (!g_file_get_contents (filename, &contents, &length, &error))
       {
          fprintf (stderr, "%s\n", error->message);
          g_error_free (error);
          return FALSE;
       }
     
       context = g_markup_parse_context_new (&parser, (GMarkupParseFlags)0, NULL, NULL);
     
       if (!g_markup_parse_context_parse (context, contents, length, NULL))
       {
          g_markup_parse_context_free (context);
          return FALSE;
       }
     
       if (!g_markup_parse_context_end_parse (context, NULL))
       {
          g_markup_parse_context_free (context);
          return FALSE;
       }
     
       g_markup_parse_context_free (context);
     
       return TRUE;
    }
     
    int main()
    {
     		gchar *p_filename= g_strdup ("fichier.xml");
     		create_xml (p_filename);
     		return(0);
    }
    mon fichier est de la sorte:
    <fichier>
    <post>
    <auteur> </auteur>
    <titre> </titre>
    <description> </description>
    </post>

    <post>
    <auteur> </auteur>
    <titre> </titre>
    <description> </description>
    </post>

    </fichier>
    j'espere que quelqu'un va m'aider.
    ++

  2. #2
    Membre éprouvé
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Points : 977
    Points
    977
    Par défaut
    Bon, je ne vais pas t'être d'une grande aide puisque je ne connais pas l'API que tu utilises. Je voulais juste te signaler qu'il existe la bibliothèque "expat", qui est très performante dans le parsing XML (je l'ai utilisée dans plusieurs applications). Pas très contraignante, et plutôt facile de prise en main. Ça ne coûte rien de jeter un oeil

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    oui j'ai deja utilisé libxml2.
    mais je me suis dit comme j'utilise glib pas la peine d'ajouter une autre bibliotheque.
    mais bon je suis bloqué depuis avant hier donc je pense que je vais le faire avec libxml2 vite fait.
    merci pour ta reponse
    ++

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par .:dev:.
    mais je me suis dit comme j'utilise glib pas la peine d'ajouter une autre bibliotheque.
    Générallement sur les systèmes Unix/Linux elle est présente de base, d'autant plus qu'elle permet de parser un document XML suivant les méthodes DOM et SAX.


    Julp.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    oui
    mon programme doit etre portable.
    si quelqu'un sait comment je peux parser le fichier qu'il n'hesite pas.
    d'autant plus qu'elle permet de parser un document XML suivant les méthodes DOM et SAX.
    je vais chercher sur ca merci

  6. #6
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 729
    Points
    1 729
    Par défaut
    Ah ça a l'air sympa le expat, bien plus léger que libxml

    Générallement sur les systèmes Unix/Linux elle est présente de base, d'autant plus qu'elle permet de parser un document XML suivant les méthodes DOM et SAX.
    Tu parles de libxml? Parce que libxml n'est pas une implementation de DOM

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Salut,
    allez voir tinyxml qui fait ca tres bien et tres tres simplement

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    tinyxml c'est en C++ non ?

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Citation Envoyé par Gruik
    Tu parles de libxml? Parce que libxml n'est pas une implementation de DOM
    Bien sûr, je voulais faire référence au fait que le document XML pouvait être chargé en mémoire (j'ai mal choisi mon terme). Toutes mes excuses.

    Par contre, pour revenir à sa portabilité :
    Citation Envoyé par http://xmlsoft.org
    Libxml2 is known to be very portable, the library should build and work without serious troubles on a variety of systems (Linux, Unix, Windows, CygWin, MacOS, MacOS X, RISC Os, OS/2, VMS, QNX, MVS, ...)

    Julp.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    sans hesiter libxml2,

    macos l'utilise meme en standard ...

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par .:dev:.
    mais le probleme c'est que chaque callback gere quelque chose
    Tout d'abord, je ne donnerai pas de code : il est tard et j'ai la flemme (désolé).

    Bon, en gros, ton problème est que tu as des fonctions qui sont appelées mais pas de "lien" entre elles.
    Si c'est ce "lien" entre elles qui te manque...il faut le créer.

    Tu aimes les automates ? J'espère que oui car, a priori (je ne connais pas la bibliothèque que tu utilises), il va falloir en créer un si tu veux utiliser cette librairie.

    Ton automate démarre dans l'état 0 ("initial").

    Un des handlers est appelé.
    Dans le cas normal, cela sera, d'après ce que j'ai compris, xml_start_element_handler() qui recevra "fichier" dans element_name, etc...
    Si effectivement il reçoit "fichier" dans l'état 0, alors l'automate passe dans l'état 1 ("fichier ouvert").
    Si il reçoit autre chose alors qu'il est dans l'état 0, alors il y a un problème et l'automate passe dans l'état "erreur", de même si il est dans l'état 0 et que c'est un autre handler qui est appelé.

    Dans l'état 1, que j'ai appelé "fichier ouvert" mais que j'aurai pû appeler "en attente d'ouverture de post", si xml_start_element_handler() est appelé avec "post" comme element_name, alors l'automate passe dans l'état 2 ("post ouvert" ou "en attente d'auteur" si l'auteur est obligatoire et suit forcément l'ouveture d'une balise "post")...
    Là, typiquement, si tu veux stocker les données dans un tableau dynqmique de structures (genre struct post { char *auteur; blabla; }, tu vas allouer de la place pour ta structure (si ce n'est déjà fait).

    Etc...

    Arrivé à l'auteur, tu vas stocker son nom (ou un pointeur vers son nom) dans la structure pour laquelle tu as précédemment alloué de la place, et ainsi de suite...d'état en état...

    Etc... (désolé pour tous ces "Etc")

    L'état de l'automate devra être sauvé dans un endroit "accessible à tous les handlers" (pas forcément directement [1]) puisqu'ils pourront être amenés à le modifier.

    Pour te simplifier la tâche dans l'écriture de code de gestion d'automate, sache qu'un membre éminent de ce forum a écrit une librairie pour ça (mais je n'ai pas l'adresse sous la main alors...prions qu'il me lise)...

    Je ne sais pas si je suis très clair mais bon...il est tard et j'aurai essayé...



    [1] : par exemple si tu utilises la librairie mentionnée...

Discussions similaires

  1. Parser fichier XML
    Par turbo_chess dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 30/01/2008, 11h17
  2. parser fichier xml
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 1
    Dernier message: 24/10/2007, 18h44
  3. [DOM] Erreur parser fichier xml avec caractère spéciaux
    Par turcotm dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 19/06/2006, 09h01
  4. [XML] [EXPAT] Parser fichier XML
    Par Ben42 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 17/02/2006, 14h08
  5. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47

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