SelectSingleNode, кажется, ищет родителей и братьев и сестер - PullRequest
1 голос
/ 28 января 2011

Я также думаю, что запутался в использовании 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 вы начинаете?

1 Ответ

7 голосов
/ 28 января 2011

Вы пытаетесь найти прямые дочерние узлы с именем number. Их нет - только один элемент things. Если вы хотите потомков, скажите так:

XmlNodeList testNodes = testRoot.SelectNodes("descendant::number");

Версия с "//number" в основном просматривает все узлов в документе, следовательно, ваш другой результат.

Сказав все это, если вы используете .NET 3.5 или выше, я просто использую LINQ to XML и выполняю все запросы в этом. Это намного приятнее API, IMO:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...