open Ocamlduce.Load let from_fun ?ns ?ent f : anyxml = let p = Expat.parser_create None in let loader = make ?ns () in Expat.set_start_element_handler p (start_elem loader); Expat.set_end_element_handler p (end_elem loader); Expat.set_character_data_handler p (text loader); (match ent with Some ent -> Expat.set_external_entity_ref_handler p (fun _ _ sys _ -> sub loader (ent sys)) | None -> ()); ignore (Expat.set_param_entity_parsing p Expat.ALWAYS); let () = f (Expat.parse_sub p) in Expat.final p; get loader let from_string ?ns s = from_fun ?ns (fun p -> p s 0 (String.length s)) let from_file ?ns s = let buflen = 1024 in let buf = String.create buflen in let ic = try open_in s with exn -> failwith (Printf.sprintf "Expat-loader.from_file, file \"%s\": %s" s (Printexc.to_string exn)) in let rec loop p = let n = input ic buf 0 buflen in if (n > 0) then (p buf 0 n; loop p) in try let v = from_fun ?ns loop in close_in ic; v with exn -> close_in ic; raise exn