#include <stdlib.h> #include <string.h> #include <libxml/parser.h> #pragma comment(lib,"libxml2.lib") int _numberCpt = 0; // Permet de compter les occurrences de <Concept> int _mustMem = 0; // Si != 0, le CData du noeud doit être mémorisé (ici, pour l'exemple, on l'écrit dans la console) 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) _numberCpt = strtol((const char*)attrs[i+1],NULL,0); break; // inutile de considérer les attributs suivants } } } else if (!xmlStrcmp(name, (xmlChar*)"Concept") && _numberCpt) _numberCpt--; // On décrémente notre compteur à chaque <Concept> rencontré else if (!xmlStrcmp(name, (xmlChar*)"Attribute_Ref") && !_numberCpt) _mustMem = 1; // On souhaite mémoriser les Attribute_Ref (_numberCpt valant ici 0, nous sommes bien dans le dernier <Concept>) } void characters(void* user_data, const xmlChar *ch, int len) { if (_mustMem && len) // Si on doit mémoriser la valeur { // On va l'extraire dans un buffer char* s = (char *)malloc(sizeof(char)*len+1); *(s+len) = 0; // On place un \0 terminal de la chaine. Cette instruction génèrera un warning, mais on ne prend pas vraiment de risque ici. strncpy(s,(const char*)ch,len); // Et l'afficher dans la console printf("%s\n", s); free(s); _mustMem = 0; // Le prochain CData ne sera pas à mémoriser } } int main() { // structure permettant de renseigner les handlers perso à invoquer pour nos deux evenements de lecture xmlSAXHandler sh = { 0 }; sh.startElement = startElement; sh.characters = characters; // On appelle l'enalyse du fichier XML if(xmlSAXUserParseFile(&sh, NULL, "D:\\Documents and Settings\\THOM31R\\Bureau\\libxml2-2.7.3.win32\\ParseSample\\ParseSample\\Input.xml")) { printf("Un erreur est survenue. Le fichier XML est peut-être mal consitué"); return -1; } system ("pause"); return 0; }
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdlib.h> #include <string.h> #include <libxml/parser.h> #pragma comment(lib,"libxml2.lib") int _numberCpt = 0; // Permet de compter les occurrences de <Concept> int _mustMem = 0; // Si != 0, le CData du noeud doit être mémorisé (ici, pour l'exemple, on l'écrit dans la console) char* _resBuffer = 0; // va stocker nos donnees (évite n accès a un fichier texte int _resCursor = 0; // curseur d'ecriture dans notre buffer int _resSize = 0; // taille du buffer 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) _numberCpt = strtol((const char*)attrs[i+1],NULL,0); break; // inutile de considérer les attributs suivants } } } else if (!xmlStrcmp(name, (xmlChar*)"Concept") && _numberCpt) _numberCpt--; // On décrémente notre compteur à chaque <Concept> rencontré else if (!xmlStrcmp(name, (xmlChar*)"Attribute_Ref") && !_numberCpt) _mustMem = 1; // On souhaite mémoriser les Attribute_Ref (_numberCpt valant ici 0, nous sommes bien dans le dernier <Concept>) } void characters(void* user_data, const xmlChar *ch, int len) { if (_mustMem && len) // Si on doit mémoriser la valeur { if (_resCursor+len+1>_resSize) { _resSize += 0xFF; // on agrandit le buffer par blocs de 255 octets. if (_resBuffer) _resBuffer = realloc(_resBuffer, _resSize); else _resBuffer = malloc(_resSize); } if (_resCursor) *((_resCursor++)+_resBuffer) = ' '; // caractère séparateur de deux items. // On va l'extraire dans un buffer strncpy(_resBuffer+_resCursor,(const char*)ch,len); _resCursor+=len; *(_resCursor+_resBuffer) = 0; // caractère terminal \0 _mustMem = 0; // Le prochain CData ne sera pas à mémoriser } } int main() { FILE* f; // structure permettant de renseigner les handlers perso à invoquer pour nos deux evenements de lecture xmlSAXHandler sh = { 0 }; sh.startElement = startElement; sh.characters = characters; // On appelle l'enalyse du fichier XML if(xmlSAXUserParseFile(&sh, NULL, "D:\\Documents and Settings\\THOM31R\\Bureau\\libxml2-2.7.3.win32\\ParseSample\\ParseSample\\Input.xml")) { printf("Un erreur est survenue. Le fichier XML est peut-être mal consitué"); return -1; } // on a obtenu des résultats... if (_resBuffer) { // on en fait ici ce que l'on veut: // écriture dans la console printf("%s\n", _resBuffer); // ou dans un fichier. f = fopen("resultat.txt", "w"); if (f) { fputs(_resBuffer, f); fclose(f); } // et on libère le buffer free(_resBuffer); } system ("pause"); return 0; }
#include <stdlib.h> #include <string.h> #include <libxml/parser.h> #pragma comment(lib,"libxml2.lib") int _numberCpt = 0; // Permet de compter les occurrences de <Concept> int _mustMem = 0; // Si != 0, le CData du noeud doit être mémorisé (ici, pour l'exemple, on l'écrit dans la console) 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) _numberCpt = strtol((const char*)attrs[i+1],NULL,0); break; // inutile de considérer les attributs suivants } } } else if (!xmlStrcmp(name, (xmlChar*)"Concept") && _numberCpt) _numberCpt--; // On décrémente notre compteur à chaque <Concept> rencontré else if (!xmlStrcmp(name, (xmlChar*)"Attribute_Ref") && !_numberCpt) _mustMem = 1; // On souhaite mémoriser les Attribute_Ref (_numberCpt valant ici 0, nous sommes bien dans le dernier <Concept>) } void characters(void* user_data, const xmlChar *ch, int len) { if (_mustMem && len) // Si on doit mémoriser la valeur { // On va l'extraire dans un buffer char* s = (char *)malloc(sizeof(char)*len+1); *(s+len) = 0; // On place un \0 terminal de la chaine. Cette instruction génèrera un warning, mais on ne prend pas vraiment de risque ici. strncpy(s,(const char*)ch,len); // Et l'afficher dans la console printf("%s\n", s); fprintf(fp,"%s ",s); free(s); _mustMem = 0; // Le prochain CData ne sera pas à mémoriser } } int main() { FILE *fp; // structure permettant de renseigner les handlers perso à invoquer pour nos deux evenements de lecture xmlSAXHandler sh = { 0 }; sh.startElement = startElement; sh.characters = characters; // On appelle l'enalyse du fichier XML if(xmlSAXUserParseFile(&sh, NULL, "essai.xml")) { printf("Un erreur est survenue. Le fichier XML est peut-être mal consitué"); return -1; } fp = fopen("resultat.txt","w"); if(fp == NULL) { printf("erreur pour l'ouverture de fichier\n"); return -1; } fclose(fp); system ("pause"); return 0; }
1>------ Début de la génération : Projet : parseure, Configuration : Debug Win32 ------
1>Compilation en cours...
1>main.c
1>c:\parseure\parseure\main.c(69) : warning C4996: 'strncpy': This function or variable may be unsafe. Consider using strncpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\string.h(157) : voir la déclaration de 'strncpy'
1>c:\parseure\parseure\main.c(74) : error C2065: 'fp' : identificateur non déclaré
1>c:\parseure\parseure\main.c(74) : warning C4047: 'fonction' : 'FILE *' diffère de 'int' dans les niveaux d'indirection
1>c:\parseure\parseure\main.c(74) : warning C4024: 'fprintf' : types différents pour le paramètre formel et réel 1
1>Le journal de génération a été enregistré à l'emplacement "file://c:\parseure\parseure\Debug\BuildLog.htm"
1>parseure - 1 erreur(s), 3 avertissement(s)
======== Génération : 0 a réussi, 1 a échoué, 0 mis à jour, 0 a été ignoré ==========
mais si le but est de t'en servir dans ton soft, pourquoi passer par un fichier ? pourquoi ne pas garder ces résultats en mémoire ?
#include <stdlib.h> #include <string.h> #include <libxml/parser.h> #pragma comment(lib,"libxml2.lib") typedef struct { char* reference; void* next; } REF; typedef struct { char* ID; // a toi de le renseigner si tu en as besoin... REF* references; } CONCEPT ; CONCEPT* _concepts = 0; int _countCpt = 0; // Permet de compter les occurrences de <Concept> int _currentCpt = -1; // Permet de compter les occurrences de <Concept> int _inAttribute = 0; 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 créé 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*)"Attribute_Ref")) _inAttribute = 1; // On souhaite mémoriser les Attribute_Ref } void characters(void* user_data, const xmlChar *ch, int len) { if (_inAttribute && len) { // lien vers les references du concept courant REF* ref = _concepts[_currentCpt].references; // on créé une nouvelle reference REF* newRef = (REF*)calloc(1, sizeof(REF)); // permet de relier la nouvelle reference a la structure (liste chainee) if (ref) { while(ref->next) ref = (REF*)ref->next; ref->next = newRef; } else _concepts[_currentCpt].references = newRef; // on recopie le contenu de la reference newRef->reference = (char*)malloc(len+1); strncpy(newRef->reference, ch, len); *(newRef->reference+len) = 0; _inAttribute = 0; } } // Permet de désallouer proporement la structure void cleanup() { int i; REF* ref; for (i=0; i<_countCpt; i++) { ref = _concepts[i].references; while (ref) { free(ref->reference); ref = ref->next; } } free(_concepts); } // A fin d'exemple uniquement... void generateResultat() { FILE* fp; int i; REF* ref; if(fp=fopen("resultat.txt", "w")) { for (i=0; i<_countCpt; i++) { ref = _concepts[i].references; while (ref) { fprintf(fp, "%s ", ref->reference); ref = ref->next; } fprintf(fp, "\n"); } fclose(fp); } } int main() { // 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, "Input.xml")) { printf("Un erreur est survenue. Le fichier XML est peut-être mal consitué"); return -1; } // Optionnel : génération du fichier resultat. generateResultat(); system("type resultat.txt"); system("pause"); cleanup(); return 0; }
#include<stdio.h> #include<conio.h> int main() { ........ ....... if(cas == 1) //appel de votre solution //le résultat est doit être sauvegardé dans un fichier ou autre structure pour les utiliser après dans le main if (cas == 2 ) //appel de votre solution //le résultat est doit être sauvegardé dans un fichier ou autre structure pour les utiliser après dans le main ........... ............ return 0; }