Source

hasexp / xmlsexp.ml

Full commit
open Sexplib
open Sexp

open Xml

let rec to_sexp = function
  | PCData s -> Atom s
  | Element (tag, kvs, children) -> 
      let kvs = List.map (fun (k,v) -> List [Atom k; Atom v]) kvs in
      (* CR jfuruse: warn: it is not tail rec *)
      let children = List.map to_sexp children in
      List [ List [ Atom "tag"; Atom tag ];
	     List [ Atom "attrs"; List kvs ];
	     List [ Atom "contents"; List children ] ]
;;

let rec to_xml = function
  | Atom s -> PCData s
  | List [ List [ Atom "tag"; Atom tag ];
	   List [ Atom "attrs"; List kvs ];
	   List [ Atom "contents"; List children ] ] ->
      let kvs = List.map to_attr kvs in
      (* CR jfuruse: warn: it is not tail rec *) 
      let children = List.map to_xml children in
      Element (tag, kvs, children)
  | _ -> invalid_arg "to_xml"

and to_attr = function
  | List [ Atom k; Atom v ] -> k, v
  | _ -> invalid_arg "to_attr"
;;