2013-04-15 2 views
55

Предположим, у меня есть это (упрощенный):Как выбрать дочерние элементы любой глубины с помощью 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> 

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

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

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

ответ

89

Вы почти у цели. Просто используйте:

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

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

+0

C#, похоже, не понимает эту нотацию. '// form // input' возвращает null в C#, в то время как Chrome может найти 35 входов с использованием того же xpath – Achilles

+1

Мой последний комментарий обсуждается здесь: http://stackoverflow.com/questions/23232671/xpath-selects-in-htmlagilitypack- dont-work-as-expected – Achilles

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

добавить к нему некоторое описание. – piyushj

+0

это отлично работает в php – hanshenrik

6

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

Скажи:

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

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

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

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

Смежные вопросы