let parse_file_from_xml (inch:in_channel) =
    let xlist    = Xml.parse_in inch in
    let children = Xml.children xlist in
      (* Handling some configuration data *)
    let config   = List.flatten (List.map (Xml.children)
                                   (filter_tag children "config")) in
      parse_config config "assign_resp" (fun t -> do_assign_resp :=
                                           ((Xml.attrib t "value")="true"));
      parse_config config "sorttype" (fun t -> if (!ref_sort = No_orderthen ref_sort :=
                                        string_to_sort (Xml.attrib t "value"));
      parse_config config "default_group" (fun t -> if ((not(!server_mode)) && (List.length !groupssel) = 0) then
                                             groupssel := convert_to_int_list (Xml.attrib t "value"));
      parse_config config "default_grade" (fun t -> 
                                             default_grade := float_of_string (Xml.attrib t "value"));
      parse_config config "validity" (fun t -> if ((List.length !ref_validity) = 0) then
                                             ref_validity := string_to_valid (Xml.attrib t "value")); 
      parse_config config "allow_grading" (fun t -> 
                                             allow_grading := ((Xml.attrib t "value")="true")); 
      (* Restituting the list of the students *)
      let groups   = filter_tag children "group" in
        List.flatten (List.map (fun g ->                        
                                  (* Create the group if necessary *)
                                  let gnum  = int_of_string (Xml.attrib g "number"in
                                    (try update_group_name gnum (Xml.attrib g "name"with _ -> ());
                                  let projnode = filter_tag (Xml.children g) "projects" in 
                                    List.iter (xml_to_project gnum []) 
                                      (List.flatten (List.map (Xml.children) projnode));
                                  let studnode = filter_tag (Xml.children g) "students" in 
                                  let studlist = List.flatten (List.map (Xml.children) studnode) in
                                    List.map (xml_to_student gnum) studlist
                               ) groups)