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

GTK+ Discussion :

[Parser XML] Utilisation GMarkupParser


Sujet :

GTK+

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut [Parser XML] Utilisation GMarkupParser
    Bonjour,
    Je trouve très peu de doc sur lla librairie GTK pour le XML. Apparemment c'est une librairie relativement petite et j'avoue que les exemples ne cours pas les rues.
    J'ai tout de même réussi à écrire ça à partir d'exemple trouvé mais une erreur ressort (le problème viendrait du fichier XML) :

    Erreur à la ligne 1 caractère 1?? : Le document doit commencer par un élément (ex. <book>)
    Pour le caractère c'est pas lisible, la console (sous windows) m'affiche un "à".

    Voici le contenu de mon fichier XML (il est encodé en UTF8) :

    <item>
    <title>Titre 1</title>
    <description>Description 1</description>
    <command>Commande 1</command>
    <filename>Fichier 1</filename>
    </item>
    Et mon programme en C. Parser du XML c'est plus que flou encore pour moi, je ne comprend pas encore tous les mécanismes...

    #include <stdlib.h>
    #include <stdio.h>
    #include <glib.h>

    static void xml_start(GMarkupParseContext *context,
    const gchar *element_name,
    const gchar **attribute_names,
    const gchar **attribute_values,
    gpointer data,
    GError **error)
    {
    const gchar *element;
    element = g_markup_parse_context_get_element(context);
    }

    static void xml_end(GMarkupParseContext *context,
    const gchar *element_name,
    gpointer data,
    GError **error)
    {
    const gchar *element;
    element = g_markup_parse_context_get_element(context);
    }

    static void xml_element(GMarkupParseContext *context,
    const gchar *text,
    gsize text_len,
    gpointer data,
    GError **error)
    {
    const gchar *element;
    element = g_markup_parse_context_get_element(context);
    printf("> element : %s\n", (char*)element);
    }

    static void xml_err(GMarkupParseContext *context,
    GError *error,
    gpointer data)
    {
    g_printerr("error: %s\n", error->message);
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
    gchar* content = "C:\fc.xml";

    static GMarkupParser parser = { xml_start, xml_end, xml_element, NULL, xml_err };
    GMarkupParseContext *context;

    context = g_markup_parse_context_new (&parser, G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG, NULL, NULL);
    g_markup_parse_context_parse (context, "C:\fc.xml", -1, NULL);
    g_markup_parse_context_free (context);

    system("pause");
    return 0;
    }
    Si quelqu'un à une idée... une suggestion ! Merci de votre lecture.

    [Edit] Je n'avais pas vu l'existence du forum GTK+ dans bibliothèque... si un modérateur pense qu'il a plus sa place là bas... désolé.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    Alors, déjà je tiens insister sur un point, sinon tu risques de te faire égorger par quelques puristes du XML GMarkupParser n'est pas un parseur XML. C'est un parseur pour un format fort similaire à du XML valide, mais il y a moyen de trouver des documents XML parfaitements valides que GMarkup ne sait pas parser, et probablement l'inverse aussi. Enfin pour l'utilisation que tu en fais, ça n'est pas un souci, mais garde en tête que si tu veux un vrai parseur XML qui respecte la spec XML à la lettre, GMarkupParser n'est pas adapté.

    En ce qui concerne ton problème, c'est l'appel à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    g_markup_parse_context_parse (context, "C:\fc.xml", -1, NULL);
    qui ne va pas, le 2nd argument n'est pas un nom de fichier, mais une chaîne de caractère contenant tes données XML.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    gchar *xml_data;
    gboolean result;
    result = g_file_get_contents ("C:\fc.xml", &xml_data, NULL, NULL);
    if (!result) {
        return -1;
    }
    g_markup_parse_context_parse (context, xml_data, -1, NULL);
    g_free (xml_data);
    devrait faire l'affaire.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 168
    Points : 123
    Points
    123
    Par défaut
    Bonjour,
    Je viens de me rendre compte que mettre "C:\..." était trop facile
    Avec un content = "<book>test</book>";
    Ca fonctionne bien.

    Je n'ai pas lu grand chose sur GMarkupParser, donc merci de la précision !

    Merci de ta réponse et de ton aide

  4. #4
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 55
    Points : 73
    Points
    73
    Par défaut
    teuf13 : que conseillerais-tu si on veut un vrai parseur XML en C? (il en existe 2-3 mais pas facile de faire un choix ><)

    Merci de ta réponses d'avance.

    Kurapix

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    La libxml2 avec l'api xmltextreader

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Salut,
    J'utilise GTK, et d'après ce que vous dites, il est possible d'utiliser GMakupParser qui est dans GTK.
    J'ai donc essayé au sein d'un projet de simplement ajouter une variable de type :
    GMarkupParseContext *context;

    Mais j'ai une erreur au moment de la compilation :
    error C2275 : GMakupParserContext : utilisation non conforme de ce type comme expression

    J'ai pourtant bien mis mes includes :
    #include <gtk/gtk.h>
    #include <glib.h>
    Et d'autre librairies, pouvez vous m'expliquer mon erreur. Mon code source est celui de Wireshark (Ethereal).
    Je vous remercie.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    C'est une erreur de recopie ou bien tu as écrit GMakup au lieu de GMarkup dans ton source ?

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Non, j'ai vérifié, j'ai bien marqué :

    GMarkupParseContext *mavariable;

    Et je n'ai rien fait d'autre avec cette librairie, je ne vois vraiment pas d'ou ca peut venir

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Points : 1 633
    Points
    1 633
    Par défaut
    C'est toujours pareil hein, on ne fait pas de la divination, sans voir le code source concerné, c'est très difficile de répondre.

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Oui c'est vrai que c'est dure Dsl, :
    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
    93
    94
    95
    96
    97
    98
     
    #ifdef HAVE_CONFIG_H
    # include "config.h"
    #endif
     
    #ifdef HAVE_SYS_TYPES_H
    #include <sys/types.h>
    #endif
    #include <time.h>
     
    #include <gtk/gtk.h>
    #include <glib.h>
    #include <epan/prefs.h>
     
    #include "../color.h"
    #include "capture.h"
    #include "capture-pcap-util.h"
    #include "capture_opts.h"
    #include "capture_ui_utils.h"
    #include "simple_dialog.h"
    #include <wsutil/file_util.h>
     
    #include "main_packet_list.h"
     
    #include "gtk/gui_utils.h"
    #include "gtk/color_utils.h"
    #include "gtk/recent.h"
    #include "gtk/gtkglobals.h"
    #include "gtk/main.h"
    #include "gtk/main_menu.h"
    #include "gtk/main_proto_draw.h"
    #include "gtk/main_welcome.h"
    #include "gtk/capture_dlg.h"
    #include "gtk/capture_if_dlg.h"
    #include "gtk/capture_file_dlg.h"
    #include "gtk/help_dlg.h"
    #include "gtk/stock_icons.h"
    #include "gtk/capture_globals.h"
    #include "../image/wssplash-dev.xpm"
    #include "../version_info.h"
    #include <glib.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #ifdef HAVE_AIRPCAP
    #include "airpcap.h"
    #include "airpcap_loader.h"
    #include "airpcap_gui_utils.h"
    #endif
     
    /* XXX */
    extern gint if_list_comparator_alph (const void *first_arg, const void *second_arg);
     
     
    static GdkColor header_bar_bg;
    static GdkColor topic_header_bg;
    static GdkColor topic_content_bg;
    static GdkColor topic_item_idle_bg;
    static GdkColor topic_item_entered_bg;
     
    static GtkWidget *welcome_file_panel_vb = NULL;
    #ifdef HAVE_LIBPCAP
    static GtkWidget *welcome_if_panel_vb = NULL;
    #endif
     
     
    /* The "scroll box dynamic" is a (complicated) pseudo widget to */
    /* place a vertically list of widgets in (currently the interfaces and recent files). */
    /* Once this list get's higher than a specified amount, */
    /* it is moved into a scrolled_window. */
    /* This is all complicated, the scrolled window is a bit ugly, */
    /* the sizes might not be the same on all systems, ... */
    /* ... but that's the best what we currently have */
    #define SCROLL_BOX_CHILD_BOX        "ScrollBoxDynamic_ChildBox"
    #define SCROLL_BOX_MAX_CHILDS       "ScrollBoxDynamic_MaxChilds"
    #define SCROLL_BOX_SCROLLW_Y_SIZE   "ScrollBoxDynamic_Scrollw_Y_Size"
    #define SCROLL_BOX_SCROLLW          "ScrollBoxDynamic_Scrollw"
     
    static GtkWidget *
    viveris_data() {
        GtkWidget * data;
    	data = NULL;
    	data = welcome_new();
    	GMarkupParseContext *test;
     
     
       /* les étapes à suivre :
    	*	- récupérer les trames affichées
    	*	- Ouvrir le fichier XML
    	*	- Extraire les informations 
    	*	- Traiter les informations
    	*	- Incorporer les informations dans un Widget
    	*	- retourner le widget
    	*	- faire une mise à jour du widget au fur et a mesure de la capture des trames
    	*/
     
        return data;
    }

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Salut,
    j'ai réussi à parser mon fichier XML avec gMarkup, mais pour mon projet je dois réaliser un treeview et je ne sais pas comment récupérer toutes les différentes valeurs de mon XML pour les ajouter dans un treeview.
    Je pensais créer un tableau pour stocker toutes les valeurs puis d'utlisiser mon tableau la où je rempli mon treeview mais je ne suis pas sur que ce soit le plus simple a faire.

    Est ce qu'une fois que le fichier à été parsé, il est possible d'obtenir toutes les valeur à partir d'une autre fonction ?

    En tout cas merci de partager les sources, je pense que ç aaide pas mal de gens (dont moi entre autres)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [GMarkup] Parser XML en C, comment l'utiliser ?
    Par Invité dans le forum GTK+ avec C & C++
    Réponses: 10
    Dernier message: 14/12/2010, 13h02
  2. Utilisation Parser XML
    Par guillaume40 dans le forum VB.NET
    Réponses: 2
    Dernier message: 13/07/2008, 16h55
  3. [libxml] utilisation pour parser xml
    Par untipy dans le forum XML
    Réponses: 11
    Dernier message: 25/07/2007, 13h26
  4. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  5. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17

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