Index: XMLIO_V2/dev/dev_rv/src/XMLIO/attribut.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/attribut.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/attribut.hpp	(revision 104)
@@ -38,4 +38,6 @@
          bool hasValue ;
          Ctype value ;
+         
+         virtual bool _hasValue() {return hasValue;}
 
          virtual const char * getName(void) const = 0 ;
@@ -74,16 +76,14 @@
             return value ;
          }
+         
+         virtual void assignValue(const BaseAttribut* _ba)
+         { value = ((Attribut*)_ba) -> value; hasValue = true; }
 
          virtual ostream& print(ostream & o) const
-         {
-            o<<"Attribut : "<<getName()<<"  ---->" ;
-            if (hasValue) o<< boolalpha <<" value = "<< value ;
-            else o<< "/" ;
-            return o ;
-         }
+         { if (hasValue) o << " " << getName() << "=\"" << boolalpha << value << "\"" ; return o ; }
 
          virtual void setValue(const Ctype & value_)
          { hasValue=true ; value=value_ ; }
-
+         
          virtual void getValue(Ctype & value_) const
          {
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/attribut_registrar.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/attribut_registrar.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/attribut_registrar.hpp	(revision 104)
@@ -33,17 +33,5 @@
             }         
          }
-         
-         friend ostream& operator<< (ostream& out, const AttributRegistrar& c) 
-         { out << c.toString(); return (out);}   
-               
-      protected :
-      
-         string toString(void) const
-         {
-            ostringstream st("A rÃ©implÃ©menter");
-            // A complÃ©ter
-            return (st.str());
-         }
-         
+                        
       public :
          
@@ -51,5 +39,5 @@
         {/* Ne rien faire de plus */}
         
-      private :
+      protected :
          StrHashMap<BaseAttribut> attrList;
         
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/base_attribut.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/base_attribut.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/base_attribut.hpp	(revision 104)
@@ -6,5 +6,5 @@
 
 
-using XMLIOSERVER::XMLIOIncompatibeTypeException;
+using XMLIOSERVER::XMLIOIncompatibleTypeException;
 
 namespace XMLIOSERVER
@@ -12,80 +12,46 @@
    class BaseAttribut
    {
-     public:
+      public:
      
-     virtual const char * getName(void) const = 0  ;
-        
-     virtual ostream & print(ostream& o) const = 0  ;
+         virtual const char * getName(void) const = 0  ;        
+         virtual ostream & print(ostream& o) const = 0  ;
      
-     friend ostream& operator <<(ostream& o,const BaseAttribut& Attr)
-     {return Attr.print(o) ; }
+         friend ostream& operator <<(ostream& o,const BaseAttribut& Attr)
+         {return Attr.print(o) ; }
+         
+         virtual void assignValue(const BaseAttribut*) = 0;
      
-     virtual const char * getId(void) {return getName();} ;
-     bool hasId(void){return (true);}
+         virtual const char * getId(void) {return getName();} ;
+         bool hasId(void){return (true);}
 
-     virtual void setFromString(const std::string str) = 0;
+         virtual void setFromString(const std::string str) = 0;
+     
+#define  SETTER_AND_GETTER(TYPE) \
+         virtual void setValue(const TYPE & value)          { error_set() ; }\
+         virtual void setValue(const Array<TYPE,1>& value)  { error_set() ; }\
+         virtual void setValue(const Array<TYPE,2>& value)  { error_set() ; }\
+         virtual void setValue(const Array<TYPE,3>& value)  { error_set() ; }\
+         virtual void getValue(TYPE & value)         const  { error_get() ; }\
+         virtual void getValue(Array<TYPE,1>& value) const  { error_get() ; }\
+         virtual void getValue(Array<TYPE,2>& value) const  { error_get() ; }\
+         virtual void getValue(Array<TYPE,3>& value) const  { error_get() ; }
+         
+         SETTER_AND_GETTER(int)
+         SETTER_AND_GETTER(bool)
+         SETTER_AND_GETTER(double)
+         SETTER_AND_GETTER(char)
+         SETTER_AND_GETTER(string)
       
-     virtual void setValue(const int & value)          { error_set() ; }
-     virtual void setValue(const Array<int,1>& value)  { error_set() ; }
-     virtual void setValue(const Array<int,2>& value)  { error_set() ; }
-     virtual void setValue(const Array<int,3>& value)  { error_set() ; }
+#undef SETTER_AND_GETTER
+
+         
+         virtual bool _hasValue() = 0;
+
+         static void error_set(void)
+         { throw XMLIOIncompatibleTypeException("BaseAttribut::set<type> > Setting value type is incompatible with attribut type"); }
+
+         static void error_get(void)
+         { throw XMLIOIncompatibleTypeException("BaseAttribut::set<type> >Getting value type is incompatible with attribut type"); }
      
-     virtual void setValue(const double & value)          { error_set() ; }
-     virtual void setValue(const Array<double,1>& value)  { error_set() ; }
-     virtual void setValue(const Array<double,2>& value)  { error_set() ; }
-     virtual void setValue(const Array<double,3>& value)  { error_set() ; }
-     
-     virtual void setValue(const bool & value)          { error_set() ; }
-     virtual void setValue(const Array<bool,1>& value)  { error_set() ; }
-     virtual void setValue(const Array<bool,2>& value)  { error_set() ; }
-     virtual void setValue(const Array<bool,3>& value)  { error_set() ; }
-     
-     virtual void setValue(const char * value)            { error_set() ; }
-     virtual void setValue(const string & value)          { error_set() ; }
-     virtual void setValue(const Array<string,1>& value)  { error_set() ; }
-     virtual void setValue(const Array<string,2>& value)  { error_set() ; }
-     virtual void setValue(const Array<string,3>& value)  { error_set() ; }
-     
-     virtual void setValue(const char & value)          { error_set() ; }
-     virtual void setValue(const Array<char,1>& value)  { error_set() ; }
-     virtual void setValue(const Array<char,2>& value)  { error_set() ; }
-     virtual void setValue(const Array<char,3>& value)  { error_set() ; }
-
-
-     virtual void getValue(int & value) const        { error_get() ; }
-     virtual void getValue(Array<int,1>& value) const  { error_get() ; }
-     virtual void getValue(Array<int,2>& value) const  { error_get() ; }
-     virtual void getValue(Array<int,3>& value) const  { error_get() ; }
-     
-     virtual void getValue(double & value) const          { error_get() ; }
-     virtual void getValue(Array<double,1>& value) const  { error_get() ; }
-     virtual void getValue(Array<double,2>& value) const  { error_get() ; }
-     virtual void getValue(Array<double,3>& value) const  { error_get() ; }
-     
-     virtual void getValue(bool & value) const          { error_get() ; }
-     virtual void getValue(Array<bool,1>& value) const  { error_get() ; }
-     virtual void getValue(Array<bool,2>& value) const  { error_get() ; }
-     virtual void getValue(Array<bool,3>& value) const  { error_get() ; }
-     
-     virtual void getValue(char * value) const            { error_get() ; }
-     virtual void getValue(string & value) const          { error_get() ; }
-     virtual void getValue(Array<string,1>& value) const  { error_get() ; }
-     virtual void getValue(Array<string,2>& value) const  { error_get() ; }
-     virtual void getValue(Array<string,3>& value) const  { error_get() ; }
-     
-     virtual void getValue(char & value) const          { error_get() ; }
-     virtual void getValue(Array<char,1>& value) const  { error_get() ; }
-     virtual void getValue(Array<char,2>& value) const  { error_get() ; }
-     virtual void getValue(Array<char,3>& value) const  { error_get() ; }
-
-     static void error_set(void)
-     {
-        throw XMLIOIncompatibeTypeException("BaseAttribut::set<type> > Setting value type is incompatible with attribut type");
-     }
-
-     static void error_get(void)
-     {
-        throw XMLIOIncompatibeTypeException("BaseAttribut::set<type> >Getting value type is incompatible with attribut type");
-     }
    }; //class BaseAttribut
 } // namespace XMLIOSERVER
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/context.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/context.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/context.hpp	(revision 104)
@@ -9,7 +9,7 @@
       public:
             
-         Context(void) : ObjectTemplate<Context>()
+         Context(void) : ObjectTemplate<Context>(), fieldDef(NULL)
          {/* Ne rien faire de plus */}               
-         Context(const string& _id) : ObjectTemplate<Context>(_id)
+         Context(const string& _id) : ObjectTemplate<Context>(_id), fieldDef(NULL)
          {/* Ne rien faire de plus */}
          
@@ -20,4 +20,18 @@
             FieldGroup::SetContext(id);
             Field::SetContext(id);
+         }
+         
+         friend ostream& operator<< (ostream& out, const Context& c) 
+         { 
+            out << "<" << c.getName()<< " id=\"" <<  c.getId() << "\">";
+            if(c.fieldDef != NULL) out << std::endl << *(FieldGroup*)c.fieldDef << std::endl;
+            out << "</" << c.getName()<< ">";
+            return (out);
+         } 
+         
+         void resolveDescInheritance(void)
+         {
+            // RÃ©solution des hÃ©ritages descendants pour chacun des groupes de dÃ©finitions.
+            fieldDef->resolveDescInheritance();
          }
          
@@ -80,12 +94,11 @@
          }
          
-         virtual const char* getName(void) const {return ("Context"); }
+         const char* getName(void) const {return ("Context"); }
          
          FieldDefinition* getFieldDefinition(void) { return (this->fieldDef); }
                   
          ~Context()
-         { delete fieldDef; }
-         
-      protected:
+         { delete fieldDef; }      
+
       
       private:
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/field.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/field.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/field.hpp	(revision 104)
@@ -10,4 +10,5 @@
    {
       public:
+      
          Field(void) : ObjectTemplate<Field>(), FieldAttribut()
 			{/* Ne rien faire de plus */}	         	
@@ -15,14 +16,36 @@
          {/* Ne rien faire de plus */}	
          
-         void setAttributes(const THashAttributes& attr)
+         friend ostream& operator<< (ostream& out, const Field& c) 
          {
-            for (THashAttributes::ConstIterator it = attr.begin(); it != attr.end(); it++)
-               if ((*it).first.compare(string("id"))) // Non prise en compte de l'identifiant lors de l'affectation des attributs.
-                  this->setSAttribut((*it).first, (*it).second);
-            
-            return;
+            out << "<" << c.getName();
+            if(c.hasId()) out << " id=\"" <<  c.getId() << "\"";
+            for(unsigned int i = 0; i < c.attrList.getVectorSize(); i++) out << *c.attrList.getVector()[i];
+            out << "/>";
+                           
+            return (out);
          }
          
-         virtual const char* getName(void) const {return ("Field"); }   
+         void setAttributes(const THashAttributes& _attr)
+         {
+            for (THashAttributes::ConstIterator it = _attr.begin(); it != _attr.end(); it++)
+               if ((*it).first.compare(string("id")))
+               // Non prise en compte de l'identifiant lors de l'affectation des attributs.
+                  this->setSAttribut((*it).first, (*it).second);
+         }
+         
+         void addAttributes(const StrHashMap<BaseAttribut>& _pattr)
+         {
+            StrHashMap<BaseAttribut>& _lattr = getAttributList();
+            
+            //_pattr contient les attributs du parent, _lattr les attributs locaux.
+            
+            for(unsigned int i = 0; i < _lattr.getVectorSize(); i++)
+            {
+               if(_lattr.getVector()[i]->_hasValue() or !_pattr.getVector()[i]->_hasValue()) continue;
+               _lattr.getVector()[i]->assignValue(_pattr.getVector()[i]);
+            }
+         }
+         
+         const char* getName(void) const {return ("Field"); }   
 
 			void parse (XMLNode& _node)
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/field_attribut.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/field_attribut.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/field_attribut.hpp	(revision 104)
@@ -19,7 +19,5 @@
          DECLARE_ATTR(level, int) ;
          DECLARE_ATTR(prec, int) ;
-         
-         DECLARE_ATTR(src, string) ; // TEMPORAIRE, pour fieldgroup uniquement
-      
+              
          DECLARE_ATTR(enabled, bool);
       
@@ -29,7 +27,9 @@
          DECLARE_ATTR(field_ref, string);
       
-         FieldAttribut(void)
+         FieldAttribut(void) : AttributRegistrar()
          { registerAllAttributes(); }
                          
+      private :
+      
          void registerAllAttributes(void)
          {
@@ -38,6 +38,4 @@
             RegisterAttribut(&unit) ;
             RegisterAttribut(&operation);
-            
-            RegisterAttribut(&src);// TEMPORAIRE, pour fieldgroup uniquement
       
             RegisterAttribut(&freq_op) ;
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/field_group.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/field_group.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/field_group.hpp	(revision 104)
@@ -16,8 +16,9 @@
          {/* Ne rien faire de plus */}
          
-         void setAttributes(const THashAttributes& attr)
+         void setAttributes(const THashAttributes& _attr)
          {
-            for (THashAttributes::ConstIterator it = attr.begin(); it != attr.end(); it++)
-               if ((*it).first.compare(string("id"))) // Non prise en compte de l'identifiant lors de l'affectation des attributs.
+            for (THashAttributes::ConstIterator it = _attr.begin(); it != _attr.end(); it++)
+               if ((*it).first.compare(string("id"))!= 0 and (*it).first.compare(string("src"))!=0)
+               // (Au dessus) Non prise en compte de l'identifiant et de l'inclusion de fichiers externes lors de l'affectation des attributs.
                   this->setSAttribut((*it).first, (*it).second);
             
@@ -25,5 +26,52 @@
          }
                  
-         virtual const char* getName(void) const {return ("FieldGroup"); }  
+         const char* getName(void) const {return ("FieldGroup"); }  
+         
+         friend ostream& operator<< (ostream& out, const FieldGroup& c) 
+         {            
+            out << "<" << c.getName();
+            if(c.hasId()) out << " id=\"" <<  c.getId() << "\"";
+            for(unsigned int i = 0; i < c.attrList.getVectorSize(); i++) out << *c.attrList.getVector()[i];
+            out << ">" << std::endl;
+            
+            for(unsigned int i = 0; i < c.groupList.getVector().size() ; i++)
+               out << *((FieldGroup*)c.groupList.getVector()[i])  << std::endl;
+               
+            for(unsigned int i = 0; i < c.childList.getVector().size() ; i++)
+               out << *(c.childList.getVector()[i]) << std::endl;
+               
+            out << "</" << c.getName()<< ">";
+            return (out);
+         } 
+                          
+         void addAttributes(const StrHashMap<BaseAttribut>& _pattr)
+         {          
+            StrHashMap<BaseAttribut>& _lattr = getAttributList();
+            
+            //_pattr contient les attributs du parent, _lattr les attributs locaux.
+            
+            for(unsigned int i = 0; i < _lattr.getVectorSize(); i++)
+            {
+               if(_lattr.getVector()[i]->_hasValue() or !_pattr.getVector()[i]->_hasValue()) continue;
+               _lattr.getVector()[i]->assignValue(_pattr.getVector()[i]);
+            }
+         }
+         
+         void resolveDescInheritance(StrHashMap<BaseAttribut>* _pattr = 0)
+         {
+            const vector<Field*>&  childvect = childList.getVector();
+            const vector<GroupTemplate<Field, FieldAttribut>*>& groupvect = groupList.getVector();
+            
+            // On complÃšte les propres attributs du groupe.
+            if (_pattr!= NULL) addAttributes(*_pattr);
+            
+            for(unsigned int i = 0; i < childvect.size() ; i++)
+            // on complÃšte les attributs des champs enfants
+               childvect[i] -> addAttributes(this->attrList);
+               
+            for(unsigned int i = 0; i < groupvect.size() ; i++)
+            // on complÃšte les attributs des groupes de champs enfants
+               ((FieldGroup*)groupvect[i]) -> resolveDescInheritance(&this->attrList);
+         }
          
          void parse (XMLNode& _node)
@@ -31,8 +79,15 @@
             string name = _node.getElementName();            
             THashAttributes attributes;
-            
+
             /// PARSING GESTION DES ATTRIBUTS ///
             _node.getAttributes(attributes);  
             this->setAttributes(attributes);
+            
+            if (attributes.end() != attributes.find("src"))
+            { // Si une demande d'inclusion de fichier est trouvÃ©.
+               XMLNode _node_inc = getNodeIncludedFile(attributes["src"], name);
+               parse (_node_inc);
+            }
+            
             attributes.clear();
                
@@ -58,10 +113,10 @@
                         if (FieldGroup::HasObject(attributes["id"]))
                            WARNING("Dans le context actuel, un groupe de champ du mÃªme nom existe dÃ©jÃ , le second fera rÃ©fÃ©rence au premier par dÃ©faut !"); // TODO TODO
-                        fgroup =(FieldGroup*)&createGroup(attributes["id"]);
+                        fgroup = (FieldGroup*)(&createGroup(attributes["id"]));
                         fgroup->parse(_node);
                      }
                      else
                      {// Si l'identifiant n'est pas dÃ©fini.
-                        fgroup = (FieldGroup*)&createGroup();
+                        fgroup = (FieldGroup*)(&createGroup());
                         fgroup->parse(_node);
                      }
@@ -79,10 +134,10 @@
                         if (Field::HasObject(attributes["id"]))
                            WARNING("Dans le context actuel, un champ du mÃªme nom existe dÃ©jÃ , le second fera rÃ©fÃ©rence au premier par dÃ©faut !");  // TODO TODO
-                        field =(Field*)&createChild(attributes["id"]);
+                        field = (Field*)(&createChild(attributes["id"]));
                         field->parse(_node);
                      }
                      else
                      {// Si l'identifiant n'est pas dÃ©fini.
-                        field = (Field*)&createChild();
+                        field = (Field*)(&createChild());
                         field->parse(_node);
                      }         
@@ -102,6 +157,6 @@
          
          virtual ~FieldGroup(void) 
-         {/* Ne rien faire de plus */}   
-         
+         {/* Ne rien faire de plus */ }
+                 
    }; // class FieldGroup
      
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/main.cpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/main.cpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/main.cpp	(revision 104)
@@ -1,2 +1,4 @@
+
+// g++ -Wall -std=c++0x -g  -o ../../bin/XMLIOServer -I/local/tools/svn/external/include/ -L/local/tools/svn/external/lib main.cpp main_cpp.cpp -lPOCO_XML -lPOCO_Foundation -lpthread
 
 extern "C" void main_c_(void) ;
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/main_cpp.cpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/main_cpp.cpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/main_cpp.cpp	(revision 104)
@@ -11,6 +11,23 @@
 	try
 	{
-		XMLParser::CLASS_TEST();            
-		// Code Ã  executer ici
+      string file("/local/testsuite/iodef_test.xml");
+      ifstream istr( file.c_str() , ifstream::in );
+      
+      // On commence la lecture du flux de donnÃ©e xml qui doit possÃ©der pour racine un unique noeud nommÃ© "simulation".
+      XMLNode node = XMLNode::CreateNode(istr, "simulation");
+      // On parse le fichier xml noeud par noeud (ie on construit dynamiquement notre arbre d'objets).
+      XMLParser::Parse(node); 
+      // On rÃ©soud les hÃ©ritages descendants ainsi que les hÃ©ritages par rÃ©fÃ©rence.
+      XMLParser::ResolveInheritance();
+      
+      // On poursuit le traitement ...
+      
+      // On Ã©crit l'arborescence resultante du traitement sur la sortie.
+      XMLParser::ShowTree(std::clog);
+      
+      /*std::clog << "Nombre de Contexts listÃ©s : " << Context::GetCurrentListObject().getSize() << " contre 1 attendus."<< std::endl;
+      std::clog << "Nombre de FieldGroups listÃ©s : " << FieldGroup::GetCurrentListObject().getSize() << " contre 5 attendus."<< std::endl;
+      std::clog << "Description du champs votkeavt : " << Field::GetObject("votkeavt").axis_ref << " contre \"Vertical Eddy Diffusivity\" attendus."<< std::endl;*/
+
 	}
 	catch(const XMLIOException &exc)
@@ -18,5 +35,5 @@
 		ERROR(exc.displayText()); 
 		// On retourne le code d'erreur en fin d'application pour traitements Ã©ventuels.
-//		return (exc.code());
+      //	return (exc.code());
 	}
       
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_container.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_container.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_container.hpp	(revision 104)
@@ -34,5 +34,5 @@
          bool hasMappedValue(const Key& kval) {return (find(kval) != this->end());}
           
-         const vector<Mapped*> getVector(void) { return (this->_elemList); }         
+         const vector<Mapped*>& getVector(void) const { return (this->_elemList); }         
 
          size_t getVectorSize(void) const {return (this->_elemList.size());}
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_exception.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_exception.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_exception.hpp	(revision 104)
@@ -65,8 +65,8 @@
    }; //class XMLParsingException
    
-   class XMLIOIncompatibeTypeException : public XMLIOException
+   class XMLIOIncompatibleTypeException : public XMLIOException
    {
       public :
-         XMLIOIncompatibeTypeException(const std::string& _msg): XMLIOException(_msg, 1003) {}
+         XMLIOIncompatibleTypeException(const std::string& _msg): XMLIOException(_msg, 1003) {}
          const char* name(void) const throw() { return ("XMLIO>XMLIOIncompatibeTypeException"); }
             
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_group_template.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_group_template.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_group_template.hpp	(revision 104)
@@ -14,6 +14,4 @@
          {/* Ne rien faire de plus */}            
       
-         virtual const char* getName(void) const {return ("GroupTemplate"); }
-                 
          /// Pour les groupes d'objets enfants ///
          
@@ -24,4 +22,10 @@
               
             return (GroupTemplate<T, U>::GetObject(_id));
+         }
+         
+         XML::XMLNode getNodeIncludedFile(const string& path, const string& _rootName)
+         {
+            ifstream istr( path.c_str() , ifstream::in );
+            return XML::XMLNode::CreateNode(istr, _rootName);
          }
          
@@ -75,5 +79,4 @@
       protected:
       
-      private:
          StrHashMap<T> childList;
          StrHashMap<GroupTemplate<T, U> > groupList;
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_logger.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_logger.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_logger.hpp	(revision 104)
@@ -52,11 +52,4 @@
    static ILogger LOGGER("xmlio.log");
 
-#define   ERROR(MSG)   (ILogger::GetConsoleLogger().error(MSG))
-#define   WARNING(MSG)   (ILogger::GetConsoleLogger().warning(MSG))
-#define   INFO(MSG)   (ILogger::GetConsoleLogger().information(MSG))
-// A complÃ©ter.
-
-
-
 /************* POUR MEMOIRE **********************
 #include <stdio.h> 
@@ -91,3 +84,8 @@
 }; // namespace XMLIOSERVER
 
+#define   ERROR(MSG)   (XMLIOSERVER::ILogger::GetConsoleLogger().error(MSG))
+#define   WARNING(MSG) (XMLIOSERVER::ILogger::GetConsoleLogger().warning(MSG))
+#define   INFO(MSG)    (XMLIOSERVER::ILogger::GetConsoleLogger().information(MSG))
+// A complÃ©ter.
+
 #endif // __XMLIO_LOGGER__  
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object.hpp	(revision 104)
@@ -24,5 +24,5 @@
          {/* Ne rien faire de plus */}      
    
-         const string& getId(void) throw (XMLIOUndefinedValueException)
+         const string& getId(void) const throw (XMLIOUndefinedValueException)
          { if (!IdDefined) throw XMLIOUndefinedValueException("Appel de la mÃ©thode AbstractObject::getId invalide."); return (id); }   
          
@@ -38,22 +38,9 @@
          }
          
-         friend ostream& operator<< (ostream& out, const AbstractObject& c) 
-         { out << c.toString(); return (out);}   
-         
          virtual ~AbstractObject(void)
          {/* Ne rien faire de plus */}
       
       protected :
-      
-         virtual string toString(void) const
-         {
-            ostringstream st("[");
-            st << "[" << this->getName();
-            if (hasId()) st << " id=\"" <<  id << "\"";
-            st << "]" ;
-            return (st.str());
-         }
-         
-         virtual const char* getName(void) const {return ("AbstractObject"); }
+
             
       private :
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_object_template.hpp	(revision 104)
@@ -38,6 +38,9 @@
          { return (*ObjectTemplate<T>::AllListObj[CurrContext][_id]); }
          
-         static bool HasObject(const string _id)// << Bug
-         { return (ObjectTemplate<T>::AllListObj[CurrContext].hasMappedValue(_id)); }
+         static bool HasObject(const string _id)
+         {
+            if(ObjectTemplate<T>::AllListObj.find(CurrContext) == ObjectTemplate<T>::AllListObj.end()) return false;
+            return (ObjectTemplate<T>::AllListObj[CurrContext].hasMappedValue(_id));
+         }
          
          static const StrHashMap<T>& GetCurrentListObject(void) { return (AllListObj[CurrContext]); }
@@ -47,6 +50,4 @@
          
          static string& GetCurrentContextId(void) { return (CurrContext); } 
-         
-         virtual const char* getName(void) const {return ("ObjectTemplate"); }
          
          virtual ~ObjectTemplate(void)
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_node.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_node.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_node.hpp	(revision 104)
@@ -58,6 +58,7 @@
             { /* Ne rien faire de plus */}          
 
-            static XMLNode& CreateNode(XMLNode& node, istream& _istr, const string& _rootName = string("simulation"))
+            static XMLNode CreateNode(istream& _istr, const string& _rootName = string("simulation"))
             {
+               XMLNode node(_rootName);
                if ((_istr.good()))
                { // S'il est possible de lire le flux en entrÃ©e ...
@@ -69,8 +70,5 @@
                   node.pDoc = parser.parse(&src);
                   if (!(node.pDoc->documentElement()->nodeName().compare(_rootName)))
-                  {
-                     node.setCNode(node.pDoc->documentElement());
-                     node.goToChildElement();
-                  }
+                  { node.setCNode(node.pDoc->documentElement()); }
                   else
                   {
Index: XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_parser.hpp
===================================================================
--- XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_parser.hpp	(revision 102)
+++ XMLIO_V2/dev/dev_rv/src/XMLIO/xmlio_xml_parser.hpp	(revision 104)
@@ -1,4 +1,6 @@
 #ifndef __XMLIO_XML_PARSER__
 #define __XMLIO_XML_PARSER__ 
+
+#include <stdlib.h>
 
 // Utilisation de la STL
@@ -18,4 +20,8 @@
             {
                THashAttributes attributes;
+               
+               _node.goToChildElement(); // On se place sur le premier Ã©lÃ©ment enfant du noeud racine.
+               atexit (&XMLParser::FreeMemory); // Pour supprimer la mÃ©moire liÃ©e Ã  l'allocation dynamique en fin d'exÃ©cution du programme.  
+
                               
                do {                
@@ -36,5 +42,35 @@
                   
                } while (_node.goToNextElement());               
-            } 
+            }
+            
+            static void ResolveInheritance(void)
+            {
+               HashMap<string, StrHashMap<Context> > &AllListContext = Context::GetAllListObject();
+               
+               for (HashMap<string, StrHashMap<Context> >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++)
+               {
+                  string& id = (*it).first;
+                  StrHashMap<Context>& sc = (*it).second;
+                  
+                  // RÃ©solution des hÃ©ritages des descendands (cÃ d des hÃ©ritages de groupes) pour chacun des contextes.
+                  sc[id]->resolveDescInheritance();
+               }               
+            }
+            
+            static void ShowTree(ostream& os = std::clog)
+            {
+               clog <<  "<?xml version=\"1.0\"?>" << std::endl << "<Simulation>" << std::endl;
+               HashMap<string, StrHashMap<Context> > &AllListContext = Context::GetAllListObject();
+               
+               for (HashMap<string, StrHashMap<Context> >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++)
+               {
+                  string& id = (*it).first;
+                  StrHashMap<Context>& sc = (*it).second;
+                  
+                  // On sort chacun des contextes successivement.
+                  clog << *sc[id] << std::endl;
+               } 
+               clog << "</Simulation>" << std::endl  ;
+            }
             
             static void FreeMemory(void)
@@ -46,24 +82,6 @@
                   string& id = (*it).first;
                   StrHashMap<Context>& sc = (*it).second;
-                  // BUG AllListContext contient une StrHashMap<Context> liÃ©e Ã  l'identifiant "" d'oÃ¹ la vÃ©rification ci-dessous.
-                  if (id.size()>0) delete sc[id];
+                  delete sc[id];
                }
-            }
-            
-            static bool CLASS_TEST(const string& file = string("/local/testsuite/iodef_test.xml"), ostream& log = std::clog)
-            {
-               ifstream istr( file.c_str() , ifstream::in );
-               XMLNode node("simulation");
-               XMLNode::CreateNode(node, istr, "simulation");
-               XMLParser::Parse(node);
-               log << "Nombre de Contexts listÃ©s : " << Context::GetCurrentListObject().getSize() << " contre 1 attendus."<< std::endl;
-               log << "Nombre de FieldGroups listÃ©s : " << FieldGroup::GetCurrentListObject().getSize() << " contre 5 attendus."<< std::endl;
-               log << "Description du champs votkeavt : " << Field::GetObject("votkeavt").description << " contre \"Vertical Eddy Diffusivity\" attendus."<< std::endl;
-               
-               log << "Test  XMLParser ... ok !" << std::endl;
-               
-               FreeMemory(); // Pour supprimer la mÃ©moire liÃ©e Ã  l'allocation dynamique.
-               
-               return (true);
             }
                  
