Як вибрати дочірні елементи будь-якої глибини за допомогою 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'] недійсний.

Отже, як мені надійно вибрати цю кнопку надсилання, не використовуючи ідентифікатори елементів?

Відповіді:


157

Ти майже там. Просто використовуйте:

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

//Ярлик також можна використовувати всередині виразу.


Здається, C # не розуміє цього позначення. //form//inputповертає нуль у 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']");

Це залежить від інструменту, яким ви користуєтесь. Але .// вибере будь-яку дочірню довільну точку з контрольного вузла.


Добре працює в Powershell за допомогою команди SelectSingleNode на певному XML-вузлі, витягнутому раніше.
Gizmo3399


0

Крім того, ви можете зробити це за допомогою селекторів css:

form#myform input[type='submit']

пробіл між елементами в елементі css означає пошук введення [type = 'submit'], що елементи на будь-якій глибині батьківської форми # елемент myform

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.