Перебор XmlNodeList и xpath в C#

107
14 июля 2021, 15:10

При выполнении кода:

XmlDocument document = new XmlDocument();
document.LoadXml("<Root><Node>Node1</Node><Node>Node2</Node><Node>Node3</Node></Root>");
foreach (XmlNode node in document.SelectNodes("//*[local-name()='Node']"))
{
    Console.WriteLine(node.OuterXml);
    Console.WriteLine(node.SelectSingleNode("//*[local-name()='Node']").InnerText);
}

Получается результат:

<Node>Node1</Node>
Node1
<Node>Node2</Node>
Node1
<Node>Node3</Node>
Node1

Почему метод SelectSingleNode с выражением xpath всегда возвращает Node1? Почему поиск осуществляется не в рамках узла у которого данный метод был вызван, а по всему документу?
Мне казалось есть узел, есть его содержимое, есть метод, вызываемый у этого узла, есть некая работа метода, связанная с этим узлом и вот результат, связанный с этим узлом.
Что я не понимаю и как это исправить, что бы результат зависел от текущего узла?

Answer 1

Вы ведь уже нашли нужные вам ноды, и перебираете их в цикле. Просто уберите повторный поиск:

XmlDocument document = new XmlDocument();
document.LoadXml("<Root><Node>Node1</Node><Node>Node2</Node><Node>Node3</Node></Root>");
foreach (XmlNode node in document.SelectNodes("//*[local-name()='Node']"))
{
    Console.WriteLine(node.OuterXml);
    Console.WriteLine(node.InnerText);
}

Если нужно искать в рамках текущей ноды, а не в рамках всего документа - не начинайте xpath с //:

XmlDocument document = new XmlDocument();
document.LoadXml(
@"<Root>
<Node><a>Node1</a></Node>
<Node><a>Node2</a></Node>
<Node><a>Node3</a></Node>
</Root>");
foreach (XmlNode node in document.SelectNodes("//*[local-name()='Node']"))
{
    Console.WriteLine(node.OuterXml);
    Console.WriteLine(node.SelectSingleNode("a").InnerText);
}
<Node><a>Node1</a></Node>
Node1
<Node><a>Node2</a></Node>
Node2
<Node><a>Node3</a></Node>
Node3
READ ALSO
Передача переменных из C# в FastReport

Передача переменных из C# в FastReport

Есть веб-приложение на C#, в котором есть 3 выпадающих списка

119
Ловлю ошибку 404

Ловлю ошибку 404

Ловлю ошибку 404 в IIS название папки в URL дублируется Exception Requested URL:/test/test/LoginPageaspx Если удаляю с url один test все работает

105
Реализация WebSocket сервера

Реализация WebSocket сервера

С помощью чего можно создать вебсокет сервер с такими характеристиками? (С помощью чего, я имею ввиду, мб какие нибудь библиотеки есть которые...

96
Проверить генерик-тип интерфейса в C#?

Проверить генерик-тип интерфейса в C#?

У меня есть тип AType который реализует генерик-интерфейс IA<BType> Тип BType реализует интерфейс ICКак я могу проверить связан AType с IC или нет?

99