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.

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>
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
gcc rechercheNote.c -lxml2 -I/usr/include/libxml2 -o test
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;
}
Ca fonctionne bien, si on recherche map, on reçoit bien 65 .

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:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
xmlNodePtr n = xpathRes_midi->nodesetval->nodeTab[0];
Et j'ai pas trouvé le moyen de blinder, je ne sais pas comment protéger mon pauvre petit programme...

Donc j'en appel à votre connaissance, merci