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


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

<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>

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

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

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

4 65

4 ответа:

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

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

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

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

говорят:

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

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

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

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

//form/descendant::input[@type='submit']

кроме того, вы можете сделать это с помощью CSS-селекторов:

form#myform input[type='submit']

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