let rec group_of_xmls g = function
    [] -> g
  | (PCData _ ) :: q -> group_of_xmls g q
  | (Element (e, atts, subs)) :: q ->
      (
       match String.lowercase e with
       | s when s = group_tag ->
           let group = Tdl_types.group () in
           group.group_title <-
             get_att ~required: false atts att_title;
           group.group_id <- map_opt
               int_of_string (get_opt_att atts att_id);
           g.group_groups <-
             g.group_groups @ [group_of_xmls group subs];
       | s when s = item_tag ->
           (
            try
              let item = Tdl_types.item () in
              item.item_title <- get_att atts att_title;
              item.item_date <-
                Tdl_date.parse
                  (
                   try
                     (get_att ~required: false atts att_date)
                   with _ -> Tdl_date.mk_mail_date (Unix.time ())
                  );
              item.item_enddate <-
                (
                 try
                   Some (Tdl_date.parse
                           (get_att ~required: false atts att_enddate))
                 with _ -> None
                );
              item.item_state <-
                (state_of_string
                   (get_att ~required:false atts att_state));
              item.item_desc <- get_item_desc subs;
              item.item_id <- map_opt
               int_of_string (get_opt_att atts att_id);

              g.group_items <- g.group_items @ [item]
            with
             e ->
               ()
           )
       | _ ->
           ()
      );
      group_of_xmls g q