Bonjour,
J'ai lu beaucoup des fois la documentation de libxml2. Mais, je n'arrive pas à trouver une solution à mon problème car c'est la première fois que je fais la manipulation de fichier XML dans un programme C en utilisant la méthode SAX de la librairie Iibxml2. De plus, le reste du mon travail se base sur le résultat trouvé dans la solution de ce problème.
Je veux utiliser la solution proposée par vous comme une fonction pour l'appeler dans mon programme.
Mon travail consiste à faire deux choses (deux fonctions) :
- la première fonction permet d'extraire les informations (qui sont des chaines de caractères) qui existent entre la balise et <\intent> concernant le dernier identificateur <\ID> du dernière balise <concept> <\concept>
cette fonction nous donne comme un résultat un tableau ou un fichier contenant :
"d b c a"
Dans notre cas ici, on aura une seule ligne du fichier ou bien une seule case du tableau contenant "d b c a"
- La deuxième fonction permet d'extraire les informations (chaines de caractères) qui existent entre la balise et <\intent> de tous les identificateurs <\ID> sauf le dernier identificateur <\ID>
et si la balise <\intent> du premier identificateur <\ID> n'est pas vide alors nous mettons l'information entre <\intent> dans le résultat
Sinon si la balise <\intent> du premier identificateur <\ID> est vide comme dans notre cas alors nous ne mettons pas l'information entre <\intent> dans le résultat.
cette fonction nous donne comme un résultat un tableau ou un fichier contenant les chaines de caractères recherchées.
Dans notre cas ici, on aura des lignes du fichier ou bien des cases du tableau contenant:
"a"
"b"
"c"
"d"
"a c"
"b c"
"b d"
"c d"
"a b d"
Voici mon fichier XML complet nommé "essai.xml":
<Galicia_Document>
<Lattice numberObj= "5" numberAtt="4" numberCpt="11">
<Name>lattice(essai)</Name>
<Object>3</Object>
<Object>2</Object>
<Object>1</Object>
<Object>5</Object>
<Object>4</Object>
d
b
c
a
<Concept>
1
<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>
</Concept>
<Concept>
2
<Extent>
<Object_Ref>1</Object_Ref>
<Object_Ref>5</Object_Ref>
</Extent>
a
<Concept_Ref>1</Concept_Ref>
</Concept>
<Concept>
5
<Extent>
<Object_Ref>2</Object_Ref>
<Object_Ref>5</Object_Ref>
<Object_Ref>4</Object_Ref>
</Extent>
b
<Concept_Ref>1</Concept_Ref>
</Concept>
<Concept>
4
<Extent>
<Object_Ref>3</Object_Ref>
<Object_Ref>1</Object_Ref>
<Object_Ref>4</Object_Ref>
</Extent>
c
<Concept_Ref>1</Concept_Ref>
</Concept>
<Concept>
3
<Extent>
<Object_Ref>3</Object_Ref>
<Object_Ref>2</Object_Ref>
<Object_Ref>5</Object_Ref>
</Extent>
d
<Concept_Ref>1</Concept_Ref>
</Concept>
<Concept>
8
<Extent>
<Object_Ref>1</Object_Ref>
</Extent>
c
a
<Concept_Ref>2</Concept_Ref>
<Concept_Ref>4</Concept_Ref>
</Concept>
<Concept>
9
<Extent>
<Object_Ref>4</Object_Ref>
</Extent>
b
c
<Concept_Ref>5</Concept_Ref>
<Concept_Ref>4</Concept_Ref>
</Concept>
<Concept>
6
<Extent>
<Object_Ref>2</Object_Ref>
<Object_Ref>5</Object_Ref>
</Extent>
d
b
<Concept_Ref>5</Concept_Ref>
<Concept_Ref>3</Concept_Ref>
</Concept>
<Concept>
7
<Extent>
<Object_Ref>3</Object_Ref>
</Extent>
d
c
<Concept_Ref>4</Concept_Ref>
<Concept_Ref>3</Concept_Ref>
</Concept>
<Concept>
11
<Extent>
<Object_Ref>5</Object_Ref>
</Extent>
d
b
a
<Concept_Ref>2</Concept_Ref>
<Concept_Ref>6</Concept_Ref>
</Concept>
<Concept>
10
<Extent>
</Extent>
d
b
c
a
<Concept_Ref>10</Concept_Ref>
<Concept_Ref>8</Concept_Ref>
<Concept_Ref>9</Concept_Ref>
<Concept_Ref>7</Concept_Ref>
</Concept>
</Lattice>
</Galicia_Document>
Voici mon code en se basant sur le lien
http://julp.developpez.com/c/libxml2/?page =sax
mais ne me répond pas à mon besoin :
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
/* -------------------------------------------- */
#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;
void debut_element(void *user_data, const xmlChar *name, const xmlChar **attrs)
{
if (!xmlStrcmp(name, "ID"))
cur_elmt = ID;
else if (!xmlStrcmp(name, "Attribute_Ref"))
cur_elmt = ATTR_REF;
else if (!xmlStrcmp(name, "Concept_Ref"))
cur_elmt = CONCPT_REF;
else if (!xmlStrcmp(name, "Object_Ref"))
cur_elmt = OBJ_REF;
else
cur_elmt = AUTRE;
}
void caracteres(void *user_data, const xmlChar *ch, int len)
{
Concept *c = user_data;
if(cur_elmt == ID)
{
int id = strtod(ch,NULL);
int i=0;
/* est-ce que cet ID nous interesse ? */
while(c[i].id != id && c[i].id != END)
i++;
if(c[i].id == id)
{
/* si oui on alloue une nouvelle structure _Concept pour enregistrer
les infos qui viendront ensuite */
c[i].concept = malloc(sizeof (_Concept));
memset(c[i].concept,END,sizeof(_Concept));
p_concept = c[i].concept;
}
else
p_concept = NULL;
}
else if(cur_elmt == OBJ_REF)
{
if(p_concept != NULL)
{
/* cherche la premiere case de libre */
int *p = p_concept->Object_Ref;
while(*p != END)
p++;
*p = strtod(ch,NULL);
}
}
else if(cur_elmt == ATTR_REF)
{
if(p_concept != NULL)
{
int *p = p_concept->Attribute_Ref;
while(*p != END)
p++;
*p = ch[0];
}
}
else if(cur_elmt == CONCPT_REF)
{
if(p_concept != NULL)
{
int *p = p_concept->Concept_Ref;
while(*p != END)
p++;
*p = strtod(ch,NULL);
}
}
}
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("f.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;
}
Je serais très reconnaissant si vous m'aidez car j'ai besoin énormément de la solution à mon problème.
Merci.