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 :

parser un fichier xml


Sujet :

C

  1. #21
    Membre éclairé

    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 : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Petite correction :
    Dans la fonction debut_element, pour le 3ème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
      if(!xmlStrcmp(name,"Attribute_Ref")) {
          balise = (char *) malloc( sizeof(char)*(strlen("Attribute_Ref") + 1));
          strcpy(balise,name);
        }
    Pour la fonction caracteres, tu rajoutes ce que tu avais effacé précedemment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void caracteres(void *user_data, const xmlChar *ch, int len) {
      if(cpt == nbIntent && strcmp(balise, "Attribute_Ref"))
        printf(" Attribute_REf : %s\n",ch);
     
    }
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    #include <stdlib.h>
    #include <string.h>
    #include <libxml/parser.h>
    #pragma comment(lib,"libxml2.lib")
     
     
    #define MAX 10
    #define END -1 
     
    typedef struct {
     
        int Object_Ref[MAX];
        int Attribute_Ref[MAX];
        int Concept_Ref[MAX];
     
    } _Concept;
     
    typedef struct {
     
        int id;
        _Concept *concept;
     
    } Concept;
     
     
    enum ElmtType { ID, OBJ_REF, ATTR_REF, CONCPT_REF, AUTRE };
     
    enum ElmtType cur_elmt = AUTRE;
    _Concept *p_concept;
     
    int cpt = 0;
    int nbIntent = 0; 
    char *balise;
     
     
    void debut_element(void *user_data, const xmlChar *name, const xmlChar **attrs) {
     
     
      if (!xmlStrcmp(name, "Lattice")) {
            if(attrs != NULL)
                 nbIntent = atoi(attrs[5]);
       }
       if(!xmlStrcmp(name, "Intent"))
          cpt++;
     
       if(!xmlStrcmp(name,"Attribute_Ref")) {
          balise = (char *) malloc( sizeof(char)*(strlen("Attribute_Ref") + 1));
          strcpy(name,balise);
        }
    }
     
    void caracteres(void *user_data, const xmlChar *ch, int len) {
      if(cpt == nbIntent)
        printf("%s\n",ch);
     
    } 
     
     
    void fin_element(void *user_data, const xmlChar *name)
    {
        cur_elmt = AUTRE;
    }
     
    Concept* Concept_Load(const char *path, Concept *c)
    {
        xmlSAXHandler sh = { 0 };
     
        sh.startElement = debut_element;
        sh.characters = caracteres;
        sh.endElement = fin_element;
     
        if (xmlSAXUserParseFile(&sh, c, path) != 0)
            return NULL;
     
        return c;
    }
     
    int main(void)
    {
        int i;
     
        Concept c[] = { {11,NULL}, {6,NULL}, {78,NULL}, {END,NULL} };
     
        Concept_Load("essai.xml",c);
     
        for (i=0; c[i].id != END; i++)
        {
            printf("-- Concept --\n");
            printf("ID = %d\n",c[i].id);
     
            if (c[i].concept != NULL)
            {
                int j=0;
                printf("Object Ref : "); 
                while (c[i].concept->Object_Ref[j] != END)
                    printf("%d ",c[i].concept->Object_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Attribute Ref : ");
                while (c[i].concept->Attribute_Ref[j] != END)
                    printf("%c ",c[i].concept->Attribute_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Concept Ref : ");
                while (c[i].concept->Concept_Ref[j] != END)
                    printf("%d ",c[i].concept->Concept_Ref[j++]);
                printf("\n\n");
            }
            else
                printf("pas trouve.\n");
        }
     
        return 0;
    }

    Juste une question, ca fait quoi le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #pragma comment(lib,"libxml2.lib")

  2. #22
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,
    Je m'excuse pour le retard car j'ai eu un problème de connexion.
    Juste une question, ca fait quoi le
    cette instruction permet de forcer les editions de lien entre la librairie et l'environnement si vous enlevez cette instruction il aura un problème de manque d'édition de lien.

    Voici l'ancien code:
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    #include <stdlib.h>
    #include <string.h>
    #include <libxml/parser.h>
    #pragma comment(lib,"libxml2.lib")
     
     
    #define MAX 10
    #define END -1 
     
    typedef struct {
     
        int Object_Ref[MAX];
        int Attribute_Ref[MAX];
        int Concept_Ref[MAX];
     
    } _Concept;
     
    typedef struct {
     
        int id;
        _Concept *concept;
     
    } Concept;
     
     
    enum ElmtType { ID, OBJ_REF, ATTR_REF, CONCPT_REF, AUTRE };
     
    enum ElmtType cur_elmt = AUTRE;
    _Concept *p_concept;
     
    int cpt = 0;
    int nbIntent = 0; 
    char *balise;
     
     
    void debut_element(void *user_data, const xmlChar *name, const xmlChar **attrs) {
     
     
      if (!xmlStrcmp(name, "Lattice")) {
            if(attrs != NULL)
                 nbIntent = atoi(attrs[5]);
       }
       if(!xmlStrcmp(name, "Intent"))
          cpt++;
     
       if(!xmlStrcmp(name,"Attribute_Ref")) {
          balise = (char *) malloc( sizeof(char)*(strlen("Attribute_Ref") + 1));
          strcpy(name,balise);
        }
    }
     
    void caracteres(void *user_data, const xmlChar *ch, int len) {
      if(cpt == nbIntent)
        printf("%s\n",ch);
     
    } 
     
     
    void fin_element(void *user_data, const xmlChar *name)
    {
        cur_elmt = AUTRE;
    }
     
    Concept* Concept_Load(const char *path, Concept *c)
    {
        xmlSAXHandler sh = { 0 };
     
        sh.startElement = debut_element;
        sh.characters = caracteres;
        sh.endElement = fin_element;
     
        if (xmlSAXUserParseFile(&sh, c, path) != 0)
            return NULL;
     
        return c;
    }
     
    int main(void)
    {
        int i;
     
        Concept c[] = { {11,NULL}, {6,NULL}, {78,NULL}, {END,NULL} };
     
        Concept_Load("essai.xml",c);
     
        for (i=0; c[i].id != END; i++)
        {
            printf("-- Concept --\n");
            printf("ID = %d\n",c[i].id);
     
            if (c[i].concept != NULL)
            {
                int j=0;
                printf("Object Ref : "); 
                while (c[i].concept->Object_Ref[j] != END)
                    printf("%d ",c[i].concept->Object_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Attribute Ref : ");
                while (c[i].concept->Attribute_Ref[j] != END)
                    printf("%c ",c[i].concept->Attribute_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Concept Ref : ");
                while (c[i].concept->Concept_Ref[j] != END)
                    printf("%d ",c[i].concept->Concept_Ref[j++]);
                printf("\n\n");
            }
            else
                printf("pas trouve.\n");
        }
     
        return 0;
    }
    Ce code donne :
    Name>lattice(essai)</Name>

    <Object>3</Object>
    <Object>2</Object>
    <Object>1</Object>
    <Object>5</Object>
    <Object>4</Object>

    <Attribute>d</Attribute>
    <Attribute>b</Attribute>
    <Attribute>c</Attribute>
    <Attribute>a</Attribute>

    <Concept>

    <ID>1 </ID>

    <Extent>

    <Object_Ref>3</Object_Ref>

    <Object_Ref>2</Object_Ref>

    <Object_Ref>1</Object_Ref>

    <Object_Ref>5</Object_Ref>

    <Object_Ref>4</Object_Ref>

    </Extent>

    <Intent>

    </Intent>

    <UpperCovers>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 2 </ID>

    <Extent>

    <Object_Ref>1</Object_Ref>

    <Object_Ref>5</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>a</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>1</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 5 </ID>

    <Extent>

    <Object_Ref>2</Object_Ref>

    <Object_Ref>5</Object_Ref>

    <Object_Ref>4</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>b</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>1</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 4 </ID>

    <Extent>

    <Object_Ref>3</Object_Ref>

    <Object_Ref>1</Object_Ref>

    <Object_Ref>4</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>c</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>1</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 3 </ID>

    <Extent>

    <Object_Ref>3</Object_Ref>

    <Object_Ref>2</Object_Ref>

    <Object_Ref>5</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>d</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>1</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 8 </ID>

    <Extent>

    <Object_Ref>1</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>c</Attribute_Ref>

    <Attribute_Ref>a</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>2</Concept_Ref>

    <Concept_Ref>4</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 9 </ID>

    <Extent>

    <Object_Ref>4</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>b</Attribute_Ref>

    <Attribute_Ref>c</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>5</Concept_Ref>

    <Concept_Ref>4</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 6 </ID>

    <Extent>

    <Object_Ref>2</Object_Ref>

    <Object_Ref>5</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>d</Attribute_Ref>

    <Attribute_Ref>b</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>5</Concept_Ref>

    <Concept_Ref>3</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 7 </ID>

    <Extent>

    <Object_Ref>3</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>d</Attribute_Ref>

    <Attribute_Ref>c</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>4</Concept_Ref>

    <Concept_Ref>3</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 11 </ID>

    <Extent>

    <Object_Ref>5</Object_Ref>

    </Extent>

    <Intent>

    <Attribute_Ref>d</Attribute_Ref>

    <Attribute_Ref>b</Attribute_Ref>

    <Attribute_Ref>a</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>2</Concept_Ref>

    <Concept_Ref>6</Concept_Ref>

    </UpperCovers>

    </Concept>

    <Concept>

    <ID> 10 </ID>

    <Extent>

    </Extent>

    <Intent>

    <Attribute_Ref>d</Attribute_Ref>

    <Attribute_Ref>b</Attribute_Ref>

    <Attribute_Ref>c</Attribute_Ref>

    <Attribute_Ref>a</Attribute_Ref>

    </Intent>

    <UpperCovers>

    <Concept_Ref>10</Concept_Ref>

    <Concept_Ref>8</Concept_Ref>

    <Concept_Ref>9</Concept_Ref>

    <Concept_Ref>7</Concept_Ref>

    </UpperCovers>

    </Concept>

    </Lattice>
    </Galicia_Document>


    -- Concept --
    ID = 11
    pas trouve.
    -- Concept --
    ID = 6
    pas trouve.
    -- Concept --
    ID = 78
    pas trouve.
    J'ai fait les modifications demandées dernièrement :
    Petite correction :
    Dans la fonction debut_element, pour le 3ème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      if(!xmlStrcmp(name,"Attribute_Ref")) {
          balise = (char *) malloc( sizeof(char)*(strlen("Attribute_Ref") + 1));
          strcpy(balise,name);
        }
    Pour la fonction caracteres, tu rajoutes ce que tu avais effacé précedemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      void caracteres(void *user_data, const xmlChar *ch, int len) {
      if(cpt == nbIntent && strcmp(balise, "Attribute_Ref"))
        printf(" Attribute_REf : %s\n",ch);
     
    }
    Voici le nouveau code:
    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
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
     
    #include <stdlib.h>
    #include <string.h>
    #include <libxml/parser.h>
    #pragma comment(lib,"libxml2.lib")
     
     
    #define MAX 10
    #define END -1 
     
    typedef struct {
     
        int Object_Ref[MAX];
        int Attribute_Ref[MAX];
        int Concept_Ref[MAX];
     
    } _Concept;
     
    typedef struct {
     
        int id;
        _Concept *concept;
     
    } Concept;
     
     
    enum ElmtType { ID, OBJ_REF, ATTR_REF, CONCPT_REF, AUTRE };
     
    enum ElmtType cur_elmt = AUTRE;
    _Concept *p_concept;
     
    int cpt = 0;
    int nbIntent = 0; 
    char *balise;
     
     
    void debut_element(void *user_data, const xmlChar *name, const xmlChar **attrs) {
     
     
      if (!xmlStrcmp(name, "Lattice")) {
            if(attrs != NULL)
                 nbIntent = atoi(attrs[5]);
       }
       if(!xmlStrcmp(name, "Intent"))
          cpt++;
     
       if(!xmlStrcmp(name,"Attribute_Ref")) {
          balise = (char *) malloc( sizeof(char)*(strlen("Attribute_Ref") + 1));
          strcpy(balise,name);
        }
    }
     
    void caracteres(void *user_data, const xmlChar *ch, int len) {
      if(cpt == nbIntent && strcmp(balise, "Attribute_Ref"))
        printf(" Attribute_REf : %s\n",ch);
     
    } 
     
     
     
    void fin_element(void *user_data, const xmlChar *name)
    {
        cur_elmt = AUTRE;
    }
     
    Concept* Concept_Load(const char *path, Concept *c)
    {
        xmlSAXHandler sh = { 0 };
     
        sh.startElement = debut_element;
        sh.characters = caracteres;
        sh.endElement = fin_element;
     
        if (xmlSAXUserParseFile(&sh, c, path) != 0)
            return NULL;
     
        return c;
    }
     
    int main(void)
    {
        int i;
     
        Concept c[] = { {11,NULL}, {6,NULL}, {78,NULL}, {END,NULL} };
     
        Concept_Load("essai.xml",c);
     
        for (i=0; c[i].id != END; i++)
        {
            printf("-- Concept --\n");
            printf("ID = %d\n",c[i].id);
     
            if (c[i].concept != NULL)
            {
                int j=0;
                printf("Object Ref : "); 
                while (c[i].concept->Object_Ref[j] != END)
                    printf("%d ",c[i].concept->Object_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Attribute Ref : ");
                while (c[i].concept->Attribute_Ref[j] != END)
                    printf("%c ",c[i].concept->Attribute_Ref[j++]);
                printf("\n");
     
                j=0;
                printf("Concept Ref : ");
                while (c[i].concept->Concept_Ref[j] != END)
                    printf("%d ",c[i].concept->Concept_Ref[j++]);
                printf("\n\n");
            }
            else
                printf("pas trouve.\n");
        }
     
        return 0;
    }
    la compilation se passse bien mais l'exécution n'affiche rien

    Vous êtes entrain de tester votre solution proposée ?

    Merci.

Discussions similaires

  1. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  2. [xslt] Parser 2 fichiers XML
    Par malekms dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 30/12/2005, 12h22
  3. Parser un fichier XML
    Par Charlinecha dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 11/07/2005, 17h18
  4. [SAX] parser un fichier xml en Java
    Par royou dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/02/2005, 17h12
  5. parser des fichier .xml en perl
    Par djibril dans le forum Modules
    Réponses: 13
    Dernier message: 18/05/2004, 17h08

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