Bonjour, je suis débutant en XML (j'ai commencé avant-hier ), j'ai fait des recherches et j'ai trouvé quelques tutos et la bibliothèques libxml2.
Je code sur Linux un petit programme (plus précisement sur Raspbian mais passons).
J'ai donc un fichier actionToMidi.xml écrit à partir d'un petit programme fait par mes soins.
Voici le code de mon programme (just un petit init, le main et la fonction qui fait la requête) que je compile avec la commande:
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 <?xml version="1.0" encoding="UTF-8"?> <root> <action mouvement="jump">60</action> <action mouvement="corps a corps">61</action> <action mouvement="roulade">62</action> <action mouvement="monter/descendre d'un vehicule">63</action> <action mouvement="menu pause">64</action> <action mouvement="map">65</action> <action mouvement="PS menu">66</action> <action mouvement="shoot">67</action> <action mouvement="viser">68</action> <action mouvement="reload">69</action> <action mouvement="grenade">70</action> <action mouvement="second">71</action> <action mouvement="sprint">72</action> <action mouvement="phone">73</action> <action mouvement="vision nocturne">74</action> <action mouvement="take a photo">75</action> <action mouvement="swim">76</action> <action mouvement="camera">77</action> <action mouvement="move">78</action> </root>
Code : Sélectionner tout - Visualiser dans une fenêtre à part gcc rechercheNote.c -lxml2 -I/usr/include/libxml2 -o testCa fonctionne bien, si on recherche map, on reçoit bien 65 .
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 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <libxml/parser.h> #include <libxml/xpath.h> xmlXPathContextPtr ctxt_actionToMidi = NULL; xmlDocPtr doc_actionToMidi = NULL; //Initialisation pour la lecture des fichiers XML void init_XMLRead(){ // Création de l'arbre DOM à partir des fichiers XML doc_actionToMidi = xmlParseFile("actionToMidi.xml"); if (doc_actionToMidi == NULL) { fprintf(stderr, "Document XML invalide\n"); exit(EXIT_FAILURE); } // Récupération de la racine xmlNodePtr racine = xmlDocGetRootElement(doc_actionToMidi); if (racine == NULL) { fprintf(stderr, "Document XML vierge\n"); xmlFreeDoc(doc_actionToMidi); exit(EXIT_FAILURE); } xmlXPathInit(); ctxt_actionToMidi = xmlXPathNewContext(doc_actionToMidi); if (ctxt_actionToMidi == NULL) { fprintf(stderr, "Erreur lors de la création du contexte XPath\n"); exit(EXIT_FAILURE); } } char* rechercheNote(char* bouton){ char *requete = malloc(200*sizeof(char)); strcpy(requete,"/root/action[@=\""); strcat(requete,bouton); strcat(requete,"\"]"); xmlXPathObjectPtr xpathRes_midi = xmlXPathEvalExpression(BAD_CAST requete, ctxt_actionToMidi); if (xpathRes_midi == NULL) { fprintf(stderr, "Erreur sur l'expression XPath\n"); exit(-1); } printf("Pre-Manipulation du résultat\n"); // Manipulation du résultat if (xpathRes_midi->type == XPATH_NODESET) { printf("Pre nodeTab[0]\n"); xmlNodePtr n = xpathRes_midi->nodesetval->nodeTab[0]; printf("Pre return xmlNodeGetContent(n)\n"); return xmlNodeGetContent(n); } return ""; } int main () { char* buffernote=NULL; init_XMLRead(); printf("Avant recherche note\n"); buffernote=rechercheNote("map"); printf("Après recherche note\n"); printf("buffernot: %s\n",buffernote); return 0; }
Par contre, ma question et mon problème sont:
Si je modifie le mot root par racine, cube ou je ne sais quoi dans le fichier .xml, mon programme plante et j'ai une erreur de segmentation.
Le programme plante dans la fonction char* rechercheNote(char* bouton) à la ligne:
Et j'ai pas trouvé le moyen de blinder, je ne sais pas comment protéger mon pauvre petit programme...
Code : Sélectionner tout - Visualiser dans une fenêtre à part xmlNodePtr n = xpathRes_midi->nodesetval->nodeTab[0];
Donc j'en appel à votre connaissance, merci
Partager