/// <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);
}