56 lines
1.3 KiB
Plaintext
56 lines
1.3 KiB
Plaintext
|
(*
|
||
|
* 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
|
||
|
|