XML to Mapping
 
 The following is a simple demo of the XML Tree parser module. The code reads an XML file, parses it into a tree and then turns it into a pike mapping.Given the following input file: <?xml version="1.0" encoding="UTF-8"?> <reply> <seq>0</seq> <status>OK</status> <contents><token>askldjfklasdfjlasdf</token> <server_uuid>some uuid data</server_uuid> <plugin_set>201204110537</plugin_set> <loaded_plugin_set>201204110537</loaded_plugin_set> <scanner_boottime>1331388234</scanner_boottime> <msp>FALSE</msp><name>jsmith</name> <admin>TRUE</admin> </user></contents> </reply> 
([ /* 1 element */
  "reply": ([ /* 3 elements */
      "contents": ([ /* 7 elements */
          "loaded_plugin_set": "201204110537",
          "msp": "FALSE",
          "plugin_set": "201204110537",
          "scanner_boottime": "1331388234",
          "server_uuid": ">some uuid data",
          "token": "askldjfklasdfjlasdf",
          "user": ([ /* 2 elements */
              "admin": "TRUE",
              "name": "ldillon"
            ])
        ]),
      "seq": "0",
      "status": "OK"
    ])
])
int main()
{
  // parse a text file into a tree
  object t = Parser.XML.Tree.parse_file("test.xml");  // convert the tree to a mapping
  mapping m = xml_to_mapping(t);  //  print out the result
  werror("m: %On", m);  return 0;
}mapping xml_to_mapping(object n)
{
  mapping m = ([]);  // for each child of the tree's root, call the function build_mapping.
  n->iterate_children(build_mapping, m);
  return m;
}string|mapping build_mapping(mixed children, mixed|void map)
{
  if(!map) map = ([]);  // if called recursively, handle a whole sub-level of xml.
  if(arrayp(children))
  {
    foreach(children;; mixed child)
    {
      if(child->get_node_type() == Parser.XML.Tree.XML_ELEMENT)
        map[child->get_full_name()] = build_mapping2(child->get_children());
    }    // if there were some key-value pairs present (like a subtree), we can return them
    if(sizeof(map)) return map;
    // otherwise, assume it was just a value without any subtree.
    else return children->get_text() * "";
  }
  else // if we're called directly from iterate_*(), behave slightly differently. 
  {
    if(children->get_node_type() != Parser.XML.Tree.XML_ELEMENT) return 0;
    map[children->get_full_name()] = build_mapping2(children->get_children());
    return 0;
  }
}Powered by PikeWiki2  | 
|||
| gotpike.org | Copyright © 2004 - 2009 | Pike is a trademark of Department of Computer and Information Science, Linköping University | |||