Source

hasexp / xmlsexp.ml

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"
;;
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.