+ public bool Load (XmlDocument doc)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
+ doc.Load (reader);
+ LastLoaded = DateTime.Now;
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ LastLoadStatus = LoadStatus.InvalidContents;
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
+
+ public bool Load (XmlDocument doc, MSymbol key, MSymbol stop)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
+ reader.Read ();
+ while (reader.NodeType != XmlNodeType.Element)
+ reader.Read ();
+ doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+ reader.Read ();
+ XmlNode node = doc.DocumentElement;
+ while (reader.NodeType == XmlNodeType.Element
+ ? reader.Name != stop.Name
+ : reader.NodeType != XmlNodeType.EndElement)
+ if (reader.NodeType == XmlNodeType.Element
+ && reader.Name == key.Name)
+ node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader),
+ node);
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
+
+ public bool Load (XmlDocument doc, MSymbol stop)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return false;
+ try {
+ reader.Read ();
+ while (reader.NodeType != XmlNodeType.Element)
+ reader.Read ();
+ doc.LoadXml ("<" + reader.Name + "></" + reader.Name + ">");
+ reader.Read ();
+ XmlNode node = doc.DocumentElement;
+ while (reader.NodeType == XmlNodeType.Element
+ ? reader.Name != stop.Name
+ : reader.NodeType != XmlNodeType.EndElement)
+ node = doc.DocumentElement.InsertAfter (doc.ReadNode (reader), node);
+ return true;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ return false;
+ } finally {
+ reader.Close ();
+ }
+ }
+
+ public XmlNode Load (XmlDocument doc, string id, params string[] nodes)
+ {
+ if (Info.Format != Mxml)
+ throw new Exception ("Not an XML database");
+ XmlTextReader reader = get_reader (doc);
+ if (reader == null)
+ return null;
+ try {
+ int len = nodes.Length;
+ do {
+ reader.Read ();
+ } while (reader.NodeType != XmlNodeType.Element);
+ if (reader.Name != nodes[0])
+ return null;
+
+ string ns = reader.GetAttribute ("xmlns");
+ XmlNode top = doc.CreateNode (XmlNodeType.Element, nodes[0], ns);
+ XmlNode node = top;
+ int i;
+
+ for (i = 1; i + 1 < len; i++)
+ {
+ if (! reader.ReadToDescendant (nodes[i]))
+ return null;
+ node = node.InsertAfter (doc.CreateNode (XmlNodeType.Element,
+ nodes[i], ns), null);
+ }
+ if (! reader.ReadToDescendant (nodes[i]))
+ return null;
+ XmlNode ref_node = null;
+ while (reader.NodeType != XmlNodeType.EndElement)
+ {
+ if (reader.NodeType == XmlNodeType.Element)
+ {
+ if (reader.Name == nodes[i]
+ && (id == null || id == reader.GetAttribute ("id")))
+ ref_node = node.InsertAfter (doc.ReadNode (reader), ref_node);
+ else
+ reader.Skip ();
+ }
+ else
+ reader.Read ();
+ }
+ return top;
+ } catch (Exception e) {
+ Console.WriteLine (e);
+ return null;
+ } finally {
+ reader.Close ();
+ }
+ }
+
+ /// <summary>Return a list of currently available database
+ /// directory names</summary>.