/// <devdoc> /// Given a partially composed config object (possibly null) /// and some input from the config system, return a /// further partially composed config object /// </devdoc> public virtual object Create(Object parent, Object context, XmlNode section) { Hashtable res; // start res off as a shallow clone of the parent if (parent == null) { res = new Hashtable(StringComparer.OrdinalIgnoreCase); } else { res = (Hashtable)((Hashtable)parent).Clone(); } // process XML HandlerBase.CheckForUnrecognizedAttributes(section); foreach (XmlNode child in section.ChildNodes) { // skip whitespace and comments, throws if non-element if (HandlerBase.IsIgnorableAlsoCheckForNonElement(child)) { continue; } // handle <add>, <remove>, <clear> tags if (child.Name == "add") { HandlerBase.CheckForChildNodes(child); String key = HandlerBase.RemoveRequiredAttribute(child, KeyAttributeName); String value; if (ValueRequired) { value = HandlerBase.RemoveRequiredAttribute(child, ValueAttributeName); } else { value = HandlerBase.RemoveAttribute(child, ValueAttributeName); } HandlerBase.CheckForUnrecognizedAttributes(child); if (value == null) { value = ""; } res[key] = value; } else if (child.Name == "remove") { HandlerBase.CheckForChildNodes(child); String key = HandlerBase.RemoveRequiredAttribute(child, KeyAttributeName); HandlerBase.CheckForUnrecognizedAttributes(child); res.Remove(key); } else if (child.Name.Equals("clear")) { HandlerBase.CheckForChildNodes(child); HandlerBase.CheckForUnrecognizedAttributes(child); res.Clear(); } else { HandlerBase.ThrowUnrecognizedElement(child); } } return(res); }