private ConfigXmlReader FindSectionRecursive(string [] keys, int iKey, XmlUtil xmlUtil, ref int lineNumber) {
string name = keys[iKey];
ConfigXmlReader section = null;
int depth = xmlUtil.Reader.Depth;
xmlUtil.ReadToNextElement();
while (xmlUtil.Reader.Depth > depth) {
if (xmlUtil.Reader.Name == name) {
if (iKey < keys.Length - 1) {
//
// We haven't reached the section yet, so keep evaluating
//
section = FindSectionRecursive(keys, iKey + 1, xmlUtil, ref lineNumber);
if (section != null) {
break;
}
continue; // don't call "Skip" -- FindSectionRecursive forwards the reader
}
else {
//
// We've reached the section. Load the section into a string.
//
string filename = ((IConfigErrorInfo)xmlUtil).Filename;
int lineOffset = xmlUtil.Reader.LineNumber;
string rawXml = xmlUtil.CopySection();
section = new ConfigXmlReader(rawXml, filename, lineOffset);
break;
}
}
else if (iKey == 0 && xmlUtil.Reader.Name == KEYWORD_LOCATION) {
string locationSubPath = xmlUtil.Reader.GetAttribute(KEYWORD_LOCATION_PATH);
bool isValid = false;
try {
locationSubPath = NormalizeLocationSubPath(locationSubPath, xmlUtil);
isValid = true;
}
catch (ConfigurationException ce) {
xmlUtil.SchemaErrors.AddError(ce, ExceptionAction.NonSpecific);
}
if (isValid && locationSubPath == null) {
//
// Location sections that don't have a subpath are treated
// as ordinary sections.
//
section = FindSectionRecursive(keys, iKey, xmlUtil, ref lineNumber);
if (section != null) {
break;
}
continue; // don't call "Skip" -- FindSectionRecursive forwards the reader
}
}
xmlUtil.SkipToNextElement();
}
return section;
}