diff --git a/src/TerrainsXML.c b/src/TerrainsXML.c
new file mode 100644
index 0000000000000000000000000000000000000000..af220db7e7389c39e95ebde2e05c5533e88aa8e9
--- /dev/null
+++ b/src/TerrainsXML.c
@@ -0,0 +1,120 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include "TerrainsXML.h"
+
+Case* Remplir_Terrains(FILE* Terrains_XML_log, const char *filename) /* Remplit le tableau de cases à partir du fichier XML */
+{
+    fprintf(Terrains_XML_log,"I) Chargement du fichier Terrains XML  - Definition des noeuds\n");
+    node_t *rootXML, *TerrainsXML;
+    unsigned int i=0, nb_terrains=0;
+
+    rootXML = roxml_load_doc(filename);             /* Ouvre le doc XML et créé le noeud de base */
+    TerrainsXML = roxml_get_chld(rootXML, NULL, 0);    /* Descend d'un niveau dans l'arborescence */
+    nb_terrains = roxml_get_chld_nb(TerrainsXML);         /* Récupère le nombre de cases entrées dans le fichier XML */
+
+    fprintf(Terrains_XML_log,"Le fichier contient %d terrains\n", nb_terrains);
+
+    /*---------------------------------------------------------------------------------------------------*/
+
+    fprintf(Terrains_XML_log,"II) Chargement des terrains\n");
+
+    Terrain* ListeTerrains = NULL;
+    ListeTerrains = malloc(nb_terrains * sizeof(Terrain));     /* Allocation de la mémoire nécéssaire et test*/
+    if (ListeTerrains == NULL)
+    {
+        fprintf(Terrains_XML_log,"Allocation impossible \n");
+        exit(EXIT_FAILURE);
+    }
+    fprintf(Terrains_XML_log,"1) Memoire allouee avec succes \n");
+    fprintf(Terrains_XML_log,"La memoire allouee fait %d octets\n",nb_terrains * sizeof(Terrain));
+
+    /*--------------------------------------------------------------------------------------------------*/
+
+    for(i=0; i<nb_terrains; i++)   /* Boucle de remplissage des cases */
+    {
+        fprintf(Terrains_XML_log,"\nChargement du terrain numero %d\n", i+1);
+
+        Terrain Terrain_en_cours;
+
+        node_t *TerrainXML;
+        char *id_text, *name_text, *FR_text, *FRS_text, *PDR_text, *DESC_text;
+        int FR_int=0, FRS_int=0, PDR_int=0;
+
+        TerrainXML = roxml_get_chld(TerrainsXML, NULL, i);
+
+        node_t *ID, *NAME, *FR, *FRS, *PDR, *DESC;
+
+        ID = roxml_get_attr(TerrainXML, "id", 0);
+        NAME = roxml_get_attr(TerrainXML, "name", 0);
+        FR = roxml_get_attr(TerrainXML, "FR", 0);
+        FRS = roxml_get_attr(TerrainXML, "FRS", 0);
+        PDR = roxml_get_attr(TerrainXML, "PDR", 0);
+        DESC = roxml_get_attr(TerrainXML, "Desc", 0);
+
+        id_text = roxml_get_content(ID, NULL, 0, NULL);
+        name_text = roxml_get_content(NAME, NULL, 0, NULL);
+        FR_text = roxml_get_content(FR, NULL, 0, NULL);
+        FRS_text = roxml_get_content(FRS, NULL, 0, NULL);
+        PDR_text = roxml_get_content(PDR, NULL, 0, NULL);
+        DESC_text = roxml_get_content(DESC, NULL, 0, NULL);
+
+        fprintf(Terrains_XML_log,"Id : %s\n", id_text);
+        fprintf(Terrains_XML_log,"Nom : %s\n", name_text);
+        fprintf(Terrains_XML_log,"FR : %s\n", FR_text);
+        fprintf(Terrains_XML_log,"FRS : %s\n", FRS_text);
+        fprintf(Terrains_XML_log,"PDR : %s\n", PDR_text);
+        fprintf(Terrains_XML_log,"DESC : %s\n", DESC_text);
+
+        /* Convertion des caractéristiques lues vers les types de la struct Case */
+        FR_int = atoi(FR_text);
+        FRS_int = atoi(FRS_text);
+        PDR_int = atoi(PDR_text);
+
+        /* Remplissage des caractéristiques de la classe en cours */
+        switch(FR_int){
+        case 0 :
+            Terrain_en_cours.franchissable=0;
+            break;
+        case 1 :
+            Terrain_en_cours.franchissable=1;
+            break;
+        default :
+            fprintf(Terrains_XML_log,"ERREUR : FR doit prendre la valeur 0 ou 1 !\n");
+            Terrain_en_cours.franchissable=0;
+        }
+
+        switch(FRS_int){
+        case 0 :
+            Terrain_en_cours.franchissable_sorts=0;
+            break;
+        case 1 :
+            Terrain_en_cours.franchissable_sorts=1;
+            break;
+        default :
+            fprintf(Terrains_XML_log,"ERREUR : FRS doit prendre la valeur 0 ou 1 !\n");
+            Terrain_en_cours.franchissable_sorts=0;
+        }
+
+        Terrain_en_cours.PD_requis=PDR_int;
+        strcpy(Terrain_en_cours.nomTerrain, name_text);
+
+        /* Ajout du terrain rempli au tableau */
+        fprintf(Terrains_XML_log,"Insertion du terrain %d dans le tableau\n", i+1);
+        ListeTerrains[i] = Terrain_en_cours;
+
+        /* Libération des noeuds */
+        roxml_free_node(ID);
+        roxml_free_node(NAME);
+        roxml_free_node(FR);
+        roxml_free_node(FRS);
+        roxml_free_node(PDR);
+    }
+
+    roxml_free_node(rootXML);
+    roxml_free_node(TerrainsXML);
+
+    return ListeTerrains;
+}
+
+
+