ref1 = _concepts[index].extent; while (ref && ref1)
while(ref)
void DisplayConceptInfos(int index, int showExtent) { REF* ref,*ref1; // On valide la valeur de l'index if (index>0 && index<_countCpt) { if (showExtent) { ref = _concepts[index].extent; if (ref) { while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf(": "); } } ref = _concepts[index].intent; ref1 = _concepts[index].extent; while (ref && ref1) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf("\n"); } }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionref = _concepts[index].intent; if (_concepts[index].extent) { while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } } printf("\n");
<Galicia_Document> <Lattice numberObj="4" numberAtt="2" numberCpt="1"> <Name>lattice(Ctx_0)</Name> <Object>3</Object> <Object>2</Object> <Object>1</Object> <Object>10</Object> salaire_faible taille_petite <Concept> 1 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>10</Object_Ref> </Extent> nom prenom </Concept> </Lattice> </Galicia_Document>
cas 1, 2 et 3:
cas 4:
cas 5:
Appuyez sur une touche pour continuer...
// On valide la valeur de l'index if (index>=0 && index<_countCpt) {
<Galicia_Document> <Lattice numberObj="4" numberAtt="2" numberCpt="1"> <Name>lattice(Ctx_0)</Name> <Object>3</Object> <Object>2</Object> <Object>1</Object> <Object>10</Object> nom prenom <Concept> 1 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>10</Object_Ref> </Extent> nom prenom </Concept> </Lattice> </Galicia_Document>
cas 1, 2 et 3:
3 2 1 10 : nom prenom
cas 4:
cas 5:
nom prenom
cas 1, 2 et 3:
nom prenom
cas 4:
cas 5:
nom prenom
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "extraction.h" ......... int main() { .......... ......... char nom_fichier[32]; sprintf(nom_fichier,"input.xml"); //appel au solution en passant le ficher xml int extraction(nom_fichier[32]) ............ ............ return 0; }
#ifndef CAUSE_REPONSE_H #define EXTRACTION_H void startElement(void *user_data, const xmlChar *name, const xmlChar **attrs); void characters(void *user_data, const xmlChar *ch, int len); void cleanup(); void DisplayConceptInfos(int index, int showExtent); int extraction(char nom_fichier[32]); #endif // EXTRACTION_H
int main()de cette solution par
int extraction(char nom_fichier[32])
if(xmlSAXUserParseFile(&sh, NULL, "input.xml"))
if(xmlSAXUserParseFile(&sh, NULL, nom_fichier))
#include "extraction.h"
1>c:\test\test\extraction.h(4) : error C2143: erreur de syntaxe : absence de ')' avant '*'
1>c:\test\test\extraction.h(4) : error C2143: erreur de syntaxe : absence de '{' avant '*'
1>c:\test\test\extraction.h(4) : warning C4228: extension non standard utilisée : les qualificateurs situés après la virgule dans la liste des déclarateurs sont ignorés
1>c:\test\test\extraction.h(4) : error C2143: erreur de syntaxe : absence de ';' avant '*'
1>c:\test\test\extraction.h(4) : error C2059: erreur de syntaxe : ')'
1>c:\test\test\extraction.h(5) : error C2143: erreur de syntaxe : absence de ')' avant '*'
1>c:\test\test\extraction.h(5) : error C2143: erreur de syntaxe : absence de '{' avant '*'
1>c:\test\test\cextraction.h(5) : error C2059: erreur de syntaxe : 'type'
1>c:\test\test\extraction.h(5) : error
C2059: erreur de syntaxe : ')'
1>Le journal de génération a été enregistré à l'emplacement "file://c:\test\test\Debug\BuildLog.htm"
1>test - 8 erreur(s), 1 avertissement(s)
======== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
void startElement(void *user_data, const xmlChar *name, const xmlChar **attrs); void characters(void *user_data, const xmlChar *ch, int len);
#include <stdlib.h> #include <string.h> #include <libxml/parser.h> #pragma comment(lib,"libxml2.lib") #ifndef _EXTRACTION_H_ #define _EXTRACTION_H_ // Structure de base pour nos listes chainées. // Il s'agit en fait de stocker un nombre non défini de chaines de caractères typedef struct { char* reference; // la donnée proprement dite void* next; // pointeur vers la reference suivante (ou 0 s'il n'y a plus de donnée) } REF; // Structure décrivant les <Concept> typedef struct { char* ID; // Valeur de l'Id REF* intent; // Liste des de l' REF* upperCovers; // Liste des <Concept_Ref> de l' REF* extent; // Liste des <Object_Ref> de l'<extent> } CONCEPT ; void cleanup(); int lire_fichier(char*); CONCEPT* _concepts; // Tableau de <Concept> int _countCpt; // Permet de compter les occurrences de <Concept> #endif
#include "extraction.h" // Procédure servant d'exemple // Permet d'afficher les détails concernant un Concept // index: indice du concept a afficher // showExtent: indique si l'on doit ou non afficher les <Extent> void DisplayConceptInfos(int index, int showExtent) { REF* ref; // On valide la valeur de l'index if (index>= 0 && index<_countCpt) { if (showExtent) { ref = _concepts[index].extent; if (ref) { while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf(": "); } } ref = _concepts[index].intent; while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf("\n"); } } int main() { REF* index; int i; lire_fichier("Input.xml"); printf("\nCas 1, 2 et 3 :\n"); DisplayConceptInfos(_countCpt-1, 0); printf("\n"); printf("\nCas 4 :\n"); index = _concepts[_countCpt-1].upperCovers; while (index) { for (i=0; i<_countCpt; i++) { if (strcmp(index->reference, _concepts[i].ID)==0) DisplayConceptInfos(i, 1); } index = index->next; } printf("\nCas 5 :\n"); for (i=0; i<_countCpt; i++) DisplayConceptInfos(i, 0); system("pause"); cleanup(); return 0; }
#include "extraction.h" CONCEPT* _concepts = NULL; // Tableau de <Concept> int _countCpt = 0; // Permet de compter les occurrences de <Concept> int _currentCpt = -1; int _inIntent = 0; // Si a 1, la prochaine donnée lue sera un et sera ajoutée dans la liste des int _inUpperCovers = 0; // idem pour l' int _inExtent = 0; // idem pour l'<extent> int _inID = 0; // Si a 1, la prochaine donnée lue sera l'ID du <Concept> void startElement(void *user_data, const xmlChar *name, const xmlChar **attrs){ int i; // Si on est sur un Lattice... if (!xmlStrcmp(name, (xmlChar*)"Lattice") && attrs) { // On parcoure les attributs for (i = 0; attrs[i]; i+=2) { // Jusqu'à trouver l'atribut numberCpt if (!xmlStrcmp(attrs[i], (xmlChar*)"numberCpt")) { // Que l'on mémorise (strtol permet d'analyser la valeur texte, pour en faire une valeur numérique) _countCpt = strtol((const char*)attrs[i+1],NULL,0); // on alloue un tableau qui va contenir les concepts. _concepts = (CONCEPT*)calloc(_countCpt, sizeof(CONCEPT)); break; // inutile de considérer les attributs suivants } } } else if (!xmlStrcmp(name, (xmlChar*)"Concept") && _countCpt) _currentCpt++; else if (!xmlStrcmp(name, (xmlChar*)"Concept_Ref") && _countCpt) _inUpperCovers = 1; else if (!xmlStrcmp(name, (xmlChar*)"Attribute_Ref")) _inIntent = 1; else if (!xmlStrcmp(name, (xmlChar*)"Object_Ref")) _inExtent = 1; else if (!xmlStrcmp(name, (xmlChar*)"ID")) _inID = 1; } void characters(void* user_data, const xmlChar *ch, int len) { if (_inID && len) { // On va enregistrer l'ID, mais en supprimant les espaces qui semblent s'être introduits 5 while(len>1 && *ch ==32) { len--; ch+=sizeof(xmlChar); } // On supprime également les espaces qui suivent la valeur. while(len>1 && *(ch+len-1)==32) len--; _concepts[_currentCpt].ID = (char*)malloc(len+1); strncpy(_concepts[_currentCpt].ID, ch, len); *(_concepts[_currentCpt].ID+len) = 0; _inID = 0; } else if ((_inIntent || _inUpperCovers || _inExtent) && len) { // lien vers les references du concept courant REF** source; REF* ref; REF* newRef; if (_inIntent) source = &(_concepts[_currentCpt].intent); else if (_inUpperCovers) source = &(_concepts[_currentCpt].upperCovers); else if (_inExtent) source = &(_concepts[_currentCpt].extent); ref = *source; // on créé une nouvelle reference newRef = (REF*)calloc(1, sizeof(REF)); // permet de relier la nouvelle reference a la structure (liste chainee) if (ref) { // La liste contient au moins une cellule. // On va parcourir la liste a la recherche de la dernière cellule (celle qui à le pointeur next à NULL) while(ref->next) ref = (REF*)ref->next; ref->next = newRef; } else *source = newRef; // Première cellule de la liste chainée // on recopie la donnée newRef->reference = (char*)malloc(len+1); strncpy(newRef->reference, ch, len); // 0 terminal de la chaine de caractères *(newRef->reference+len) = 0; // Remise à 0 des flags de position _inIntent _inUpperCovers _inExtent = 0; } } // Permet de désallouer proprement la structure void cleanup() { int i; REF* ref; for (i=0; i<_countCpt; i++) { // On libère donc une a une les zones mémoire allouées free(_concepts[i].ID); // On néttoie ensuite les listes chainées, une à une. ref = _concepts[i].intent; while (ref) { free(ref->reference); ref = ref->next; } ref = _concepts[i].upperCovers; while (ref) { free(ref->reference); ref = ref->next; } ref = _concepts[i].extent; while (ref) { free(ref->reference); ref = ref->next; } } // Avant de désallouer le tableau de Concepts free(_concepts); } int lire_fichier(char* nom_fichier) { // structure permettant de renseigner les handlers perso à invoquer pour nos evenements de lecture xmlSAXHandler sh = { 0 }; sh.startElement = startElement; sh.characters = characters; // On appelle l'enalyse du fichier XML if(xmlSAXUserParseFile(&sh, NULL, nom_fichier)) { printf("Un erreur est survenue. Le fichier XML est peut-être mal consitué"); return -1; } return 0; }
tu n'as pas à déclarer ces fonctions, elles font partie du fonctionnement interne au parsing.
#ifndef CAUSE_REPONSE_H #define EXTRACTION_H void cleanup(); void DisplayConceptInfos(int index, int showExtent); int extraction(char nom_fichier[32]); #endif // EXTRACTION_H
void DisplayConceptInfos(int index, int showExtent);
void DisplayConceptInfos(int index, int showExtent, FILE *fp_res);
if(cas == 1) { /* dans ce cas je suis sur que dans le fichier xml on a un seul identificateur qui possède un 'extent' non vide et 'intent' non vide. Je voulais afficher dans le fichier "resultat.txt" (son descripteur est fp_res) et sur la même ligne la valeur de 'extent' suivie de la valeur 'intent'. Donc chaque ligne de ce fichier possède deux champs: 'extent et intent'.*/ } else if (cas == 2) { /* c'est le même résultat que nous avons trouvé dans la solution précédente. c'est à dire c'est le même cas 4 discuté avant mais Je voulais afficher dans le fichier "resultat.txt" (son descripteur est fp_res) et sur la même ligne la valeur de 'extent' suivie de la valeur 'intent'. Donc chaque ligne de ce fichier possède deux champs: 'extent' et 'intent'*/ } else if (cas == 3) { /* c'est le même résultat que nous avons trouvé dans la solution précédente. c'est à dire c'est le même cas 5 discuté avant mais Je voulais afficher dans un autre fichier "output.txt" (son descripteur est fp_out) chaque ligne contient la valeur 'intent'. Donc chaque ligne de ce fichier possède un seul champ: 'intent'*/ }
#include <stdlib.h> #include <stdio.h> #include <string.h> #include "extraction.h" void DisplayConceptInfos(int index, int showExtent, FILE *fp) { /*je ne sais pas on va utiliser cette fonction ou non ? */ } int main() { FILE *fp_res, *fp_out; REF* index; int i,cas; //il y a autres traitements ici ........ ......... //création de deux fichiers fp_res = fopen("resultat.txt","w"); fp_out = fopen("output.txt","w"); lire_fichier("Input.xml"); if (cas == 1) { printf("\nCas 1 :\n"); /* afficher le résultat souhaité dans le fichier "resultat.txt" */ } else if (cas == 2) { printf("\nCas 2 :\n"); /* afficher le résultat souhaité dans le fichier "resultat.txt" */ } else if (cas == 3) { printf("\nCas 3 :\n"); /* afficher le résultat souhaité dans le fichier "out.txt" */ } system("pause"); cleanup(); return 0; }
encore une fois, j'avoue ne pas comprendre pourquoi tu génères un fichier texte... tu pourrais exploiter directement les données extraites, depuis _concepts
tu as tous les cas détaillés dans mon code, dans le main.c
#include "extraction.h" // Procédure servant d'exemple // Permet d'afficher les détails concernant un Concept // index: indice du concept a afficher // showExtent: indique si l'on doit ou non afficher les <Extent> void DisplayConceptInfos(int index, int showExtent) { REF* ref; // On valide la valeur de l'index if (index>=0 && index<_countCpt) { if (showExtent) { ref = _concepts[index].extent; if (ref) { while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf(": "); } } ref = _concepts[index].intent; while (ref) { if (ref->reference) printf("%s ", ref->reference); ref = ref->next; } printf("\n"); } } int main() { REF* index; int i; lire_fichier("Input.xml"); printf("\nCas 1, 2 et 3 :\n"); DisplayConceptInfos(_countCpt-1, 0); printf("\n"); printf("\nCas 4 :\n"); index = _concepts[_countCpt-1].upperCovers; while (index) { for (i=0; i<_countCpt; i++) { if (strcmp(index->reference, _concepts[i].ID)==0) DisplayConceptInfos(i, 1); } index = index->next; } printf("\nCas 5 :\n"); for (i=0; i<_countCpt; i++) DisplayConceptInfos(i, 0); system("pause"); cleanup(); return 0; }
printf("\nCas 1, 2 et 3 :\n"); DisplayConceptInfos(_countCpt-1, 1); printf("\n");
<Galicia_Document> <Lattice numberObj="4" numberAtt="2" numberCpt="1"> <Name>lattice(Ctx_0)</Name> <Object>3</Object> <Object>2</Object> <Object>1</Object> <Object>10</Object> nom prenom <Concept> 1 <Extent> <Object_Ref>3</Object_Ref> <Object_Ref>2</Object_Ref> <Object_Ref>1</Object_Ref> <Object_Ref>10</Object_Ref> </Extent> nom prenom </Concept> </Lattice> </Galicia_Document>
Cas 1, 2 et 3 :
3 2 1 10 : nom prenom