Как выбрать дочерние элементы любой глубины с помощью XPath?

101

Предположим, у меня есть это (упрощенное):

<form id="myform">
    <!-- some input fields -->
    <input type="submit" value="proceed"/>
</form>

Затем я могу нажать кнопку отправки с помощью XPath //form[@id='myform']/input[@type='submit']. Отлично.

Однако мои шаблоны могут измениться, и я хочу быть гибким в выборе глубины расположения кнопки отправки. Это можно было бы поместить в таблицу, например:

<form id="myform">
    <!-- some input fields -->
    <table><tr><td>
           <input type="submit" value="proceed"/>
    </td></tr></table>
</form>

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

  • //form[@id='myform']/*/input[@type='submit'] выбирает только внуков, без дальнейших глубин.
  • //form[@id='myform']/*/*/input[@type='submit'] выбирает только правнуков, не более или менее глубины.
  • //form[@id='myform']/**/input[@type='submit'] не действует.

Итак, как мне надежно выбрать эту кнопку отправки без использования идентификаторов элементов?

Gertvdijk
источник

Ответы:

159

Ты почти там. Просто используйте:

//form[@id='myform']//input[@type='submit']

//Ярлык также можно использовать внутри выражения.

Nwellnhof
источник
C #, похоже, не понимает эту нотацию. //form//inputвозвращает null в C #, в то время как Chrome может найти 35 входов с использованием того же xpath
Ахилл,
1
Мой последний комментарий обсуждается здесь: stackoverflow.com/questions/23232671/…
Ахилл,
14

Если вы используете XmlDocument и XmlNode.

Сказать:

XmlNode f = root.SelectSingleNode("//form[@id='myform']");

Использование:

XmlNode s = f.SelectSingleNode(".//input[@type='submit']");

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

sk
источник
Хорошо работает в Powershell с помощью команды SelectSingleNode на определенном XML-узле, извлеченном ранее.
Gizmo3399
9
//form/descendant::input[@type='submit']
Луис Лонг
источник
7
добавить к нему описание.
piyushj 01
0

Также вы можете сделать это с помощью селекторов css:

form#myform input[type='submit']

пробел между элементами в css elector означает поиск input [type = 'submit'], что элементы на любой глубине родительской формы # myform element

Махсум Акбас
источник