Выберите первый экземпляр только с XPath? - PullRequest
19 голосов
/ 17 января 2009

Я анализирую какой-то XML примерно так:

<root>
    <some_gunk/>
    <dupe_node>
        ...
        stuff I want
        ...
    </dupe_node>
    <bits_and_pieces/>
    <other_gunk/>
    <dupe_node>
        ...
        stuff I don't want
        ...
    </dupe_node>
    <more_gunk/>
</root>

XPath '//dupe_node' даст мне два экземпляра dupe_node для игры. Я только хочу пройти первый. Могу ли я сделать это с XPath?

Ответы [ 3 ]

43 голосов
/ 17 января 2009
/descendant::dupe_node[1]

//dupe_node[1], как правило, неверно, хотя в данном конкретном случае он дает идентичный результат. См. Документы :

Путь местоположения // para [1] не означает то же самое, что путь местоположения / потомок :: para [1]. Последний выбирает первый дочерний элемент para; первый выбирает все элементы-потомки, которые являются первыми детьми-потомками своих родителей.

С учетом следующего XML:

<foo>
    <bar/>
    <foo>
        <bar/>
    </foo>
</foo>

//bar[1] создаст два узла, потому что оба столбца являются первыми дочерними элементами своих соответствующих родителей.

/descendant::bar[1] даст только один узел, который является первым из всех столбцов в документе.

6 голосов
/ 17 января 2009
//dupe_node[1]

XPath считается от 1, а не от 0 в этом случае. Вы можете использовать этот инструмент, чтобы попробовать что-то в своем браузере:

http://www.xmlme.com/XpathTool.aspx?mid=82

4 голосов
/ 17 января 2009

// dupe_node [1]

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