Я также думаю, что запутался в использовании XPath.Я новичок в C # и XPath, поэтому, пожалуйста, будьте терпеливы со мной;)
Сначала мой XML-файл, с которым я тестирую:
<?xml version="1.0" encoding="ISO-8859-1"?>
<testroot>
<testnode>
<name>Test Node 1</name>
<things>
<thing>
<number>One</number>
</thing>
<thing>
<number>Two</number>
</thing>
</things>
</testnode>
<testnode>
<name>Test Node 2</name>
<things>
<thing>
<number>Three</number>
</thing>
<thing>
<number>Four</number>
</thing>
</things>
</testnode>
<testnode>
<name>Test Node 3</name>
<things>
<thing>
<number>Five</number>
</thing>
</things>
</testnode>
</testroot>
Итак, сначала я хочу получить«testnode», который содержит «имя», в котором я заинтересован. Поэтому я сделал следующее, которое работало правильно:
XmlNode testRoot = xmlDoc.DocumentElement.SelectSingleNode("/testroot/testnode[name=\"Test Node 1\"]");
Теперь я хочу получить все узлы под ним, которые содержат "номер "элемент.Согласно моим прочтениям, я должен быть в состоянии сделать это:
XmlNodeList testNodes = testRoot.SelectNodes("number");
Но это приводит к пустому списку.Единственный способ получить какие-либо результаты - использовать //:
XmlNodeList testNodes = testRoot.SelectNodes("//number");
Проблема в том, что, похоже, выполняется поиск всех братьев и сестер и родителей testRoot.Когда я распечатываю все, я получаю каждый узел в файле, который содержит «число»:
txtOutput.InnerHtml += "<p>" + testRoot.FirstChild.InnerText + "</p>";
foreach (XmlNode node in testNodes)
{
txtOutput.InnerHtml += node.InnerText + "<br />";
}
Test Node 1
One
Two
Three
Four
Five
Это поведение смущает меня.Я неправильно использую XPath, или он обычно выполняет поиск по абсолютному корню независимо от того, с какого XmlNode вы начинаете?