Прежде всего, System.XML предоставляет несколько отличных способов работы с XML.
Я предполагаю, что вы загрузили свой XML в XMLDocument, что позволяет вам использовать XPath Selector или просто проходить через DOM.
Примерно так будет идти от любого элемента обратно к вершине с помощью рекурсии:
public XmlNode WalkToTopNode (XmlNode CurrentNode)
{
if (CurrentNode.ParentNode == null)
return CurrentNode;
else
return WalkToTopNode(CurrentNode.ParentNode);
}
Использование рекурсии для поиска узла по идентификатору можно сделать примерно так (обратите внимание, я набрал это в текстовом поле, это может быть неправильно):
public XmlNode GetElementById (string id, XmlNode node)
{
if (node.Attributes["id"] != null && node.Attributes["id"].InnerText == id)
{
return node;
}
else
{
foreach (XmlNode childNode in node.Children)
{
return GetElementById(id, childNode);
}
}
return null;
}
Однако, если вы используете рекурсию, когда в System.XML встроено так много лучших способов обхода узлов, возможно, пришло время переосмыслить вашу стратегию.