Ocaml pour lire un fichier XML

Anne ocaml xml ocamlfind

Il y a plusieurs possibilité pour lire du xml en ocaml. Mes besoins étant relativement simple, j’ai choisi Xmlm.

Un exemple

Il y a plusieurs moyen de l’utiliser. Ici, on ne parle que de la lecture d’un fichier, et l’utilisation de de la fonction Xmlm.input_doc_tree qui permet initialement de construire un arbre, mais qu’on utilise ici de manière plus simple :

let error fmt
  let f _fmt
    let msg = Format.flush_str_formatter () in
    Format.eprintf "%s@." msg;
    exit 1
  in Format.kfprintf f Format.str_formatter ("@["^^fmt^^"@]")

let get_attrib attribs aname
  let is_ok ((_uri, name), value) = (name = aname) in
  match List.filter is_ok attribs with
  | (_, value)::[] -> value
  | [] -> error "Parse error: no attribute '%s'" aname
  | _ -> error "Parse error: several values for '%s'" aname

let process file ic
  let i = Xmlm.make_input (`Channel ic) in
  let el ((uri, node), attribs) childs = match node with
  | "testcase" ->
      let name = get_attrib attribs "name" in
      let fails = List.filter (fun x -> x) childs in
      Format.printf "%s: %s@." name
        (if List.length fails = 0 then "ok" else "KO");
      false
  | "failure" -> true
  | _ -> false
  in
  let data _d = false in
  Xmlm.input_doc_tree ~el ~data i

let read file
  try ignore (process file (open_in file));
  with
    | Sys_error msg -> error "%s" msg
    | Xmlm.Error (pos, e) ->
      error "xml error at line %d: %s@." (fst pos) (Xmlm.error_message e)

let () = read Sys.argv.(1)

Pour compiler, il ne faut pas oublier la librairie :

ocamlfind ocamlopt -annot -o prog -linkpkg -package xmlm prog.ml

Et enfin pour exécuter :

./prog file.xml

Documentation

Voir aussi :