В чем разница между // узлом и / потомком :: узлом в xpath? - PullRequest
31 голосов
/ 08 октября 2009

Я использую много XPath при поиске элементов на веб-страницах с использованием Selenium, и совсем недавно перешел от использования node1 // node2 к использованию node1 / lower: :: node2. В чем разница между двумя методами? Один эффективнее другого?

Пример фрагмента XML для демонстрации:

<div id="books">
  <table>
    <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr>
    <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr>
  </table>
</div>

Так было бы:

id('books')//td[@class='title']

или

id('books')/descendant::td[@class='title']

Ответы [ 4 ]

34 голосов
/ 08 октября 2009

см. http://www.w3.org/TR/xpath#path-abbrev

// это просто аббревиатура для потомка :: ось

Редактировать

Цитировать:

// para - это сокращение от / потомок-или-себя :: node () / child :: para

То есть он относится ко всем парам, которые являются дочерними по отношению к узлу контекста или любому узлу, произошедшему от узла контекста. Насколько я могу судить, это переводится в любой потомок пункта узла контекста.

11 голосов
/ 11 января 2010

В контекстной группе есть разница. //para[1] - это сокращение от /descendant-or-self::node()/child::para[1], который возвращает каждый пункт, являющийся первым дочерним элементом своего родителя. /descendant::para[1] возвращает только первый пункт во всем поддереве.

4 голосов
/ 20 мая 2012

В вашем случае

 id('books')//td[@class='title']

и

 id('books')/descendant::td[@class='title']

возвращает тот же результат.

Но на самом деле, как уже было сказано ранее, id('books')//td[@class='title'] означает id('books')/descendant-or-self::node()/td[@class='title'], что отличается от id('books')/descendant::td[@class='title'] по концепции.

См. Следующее примечание:

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

эта заметка взята из http://www.w3.org/TR/xpath#path-abbrev

2 голосов
/ 08 октября 2009

Кроме краткости, я не знаю никакой разницы.

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