Найти узел XML на более глубоких уровнях рекурсивно в C#

Я пытаюсь получить узел на глубоком уровне для структуры XML.

Моя структура xml:

<Level1 name="data_reply"> 
  <Level2 name="name1"> 
    <level3 name="name2" />
    <Level3 name="name3 > 
        <Level4 name="name4"/>
        <Level4 name="name5" someAttributes="blah blah"/>
    </Level3> 
  <Level2 name="name6"/>
  <Level2 name="name7"/>
</Level1> 

Я хочу получить узел с именем "имя 5" и его атрибуты. Проблема в том, что я хочу получить этот узел, даже если он был глубже или уровни узла разные. Атрибуты name можно считать уникальными. Я имею в виду, что я хочу что-то вроде:

var xmlDoc = new XmlDocument();
xmlDoc.Load("FileFullPath");
var wantedNode = xmlDoc.DocumentElement.GetNodeWithName("name5") // Which can be recursive or iterative

Моя подпись метода может быть такой:

public XmlNode GetNodeWithName(string nodeNameAttributeValue){
  ... Method content
  return myNode
}

Есть ли какая-то легкость в использовании такого метода?

2 ответа

Решение

Ты можешь использовать System.Xml.Linq:

var item = xmlDoc.Descendants()
           .FirstOrDefault(node => (string)node.Attribute("name") == "name 5")

Ты можешь использовать SelectNodes() или же SelectSingleNode() которые принимают XPath выражение в качестве параметра. XPath поддерживает выражение запроса для поиска элемента с любым именем в любом месте XML-документа, где name значение атрибута равно "имя 5":

var searchParam = "name 5";
var xpath = string.Format("//*[@name='{0}']", searchParam);
var wantedNode = xmlDoc.SelectSingleNode(xpath);
Другие вопросы по тегам