lh-l4v/lib/more_xml.ML

56 lines
1.3 KiB
Standard ML

(*
* Copyright 2014, NICTA
*
* This software may be distributed and modified according to the terms of
* the BSD 2-Clause license. Note that NO WARRANTY is provided.
* See "LICENSE_BSD2.txt" for details.
*
* @TAG(NICTA_BSD)
*)
(* Poor man's extension to Isabelle's poverty-striken XML library. *)
(* Encoding strings to XML. *)
fun xml_list name attr value =
XML.Elem ((name, attr), value);
fun xml_node name value =
xml_list name [] [XML.Text value]
fun xml_attrib_node name attribs value =
xml_list name attribs [XML.Text value]
(* Decoding XML. Poor error handling, sorry. *)
fun xml_unwrap_node root =
case root of
XML.Text _ => error ("Could not unwrap element.")
| XML.Elem (_, x) => x
fun xml_unwrap_attributes root =
case root of
XML.Text _ => error ("Could not unwrap element.")
| XML.Elem ((_, x), _) => x
fun xml_get_text root =
case (xml_unwrap_node root) of
[XML.Text x] => x
| _ => error ("Expected a single node with a single text element.")
fun xml_node_name root =
case root of
XML.Text _ => error ("Expected node, but got string.")
| XML.Elem ((x,_), _) => x
fun xml_get_child name root =
(xml_unwrap_node root)
|> filter (fn n => xml_node_name n = name)
fun xml_get_attrib name root =
(xml_unwrap_attributes root)
|> map_filter (fn (n, v) => if n = name then SOME v else NONE)
|> hd