let parse_file_from_xml (inch:in_channel) =
let xlist = Xml.parse_in inch in
let children = Xml.children xlist in
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_order) then 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"));
let groups = filter_tag children "group" in
List.flatten (List.map (fun g ->
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)