Bagaimana cara memilih elemen anak dari kedalaman berapa pun menggunakan XPath?

101

Misalkan saya memiliki ini (disederhanakan):

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

Kemudian saya dapat memilih tombol kirim dengan XPath //form[@id='myform']/input[@type='submit']. Bagus.

Namun, templat saya mungkin berubah dan saya ingin fleksibel di kedalaman tempat tombol kirim berada. Bisa diletakkan di tabel, seperti ini:

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

Saya tahu saya dapat memilih elemen yang merupakan cucu, tetapi saya tidak dapat memilih cucu-cucu -...- childeren sedalam apa pun. Misalnya:

  • //form[@id='myform']/*/input[@type='submit'] hanya memilih cucu, tidak ada kedalaman lebih lanjut.
  • //form[@id='myform']/*/*/input[@type='submit'] hanya memilih cucu-cucu, tidak lebih atau kurang kedalaman.
  • //form[@id='myform']/**/input[@type='submit'] tidak valid.

Jadi, bagaimana cara memilih tombol kirim ini dengan andal tanpa menggunakan ID elemen?

gertvdijk.dll
sumber

Jawaban:

157

Kamu hampir sampai. Cukup gunakan:

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

Itu // shortcut juga dapat digunakan dalam ekspresi.

nwellnhof
sumber
C # sepertinya tidak memahami notasi ini. //form//inputmengembalikan null di C # sementara Chrome dapat menemukan 35 input menggunakan xpath yang sama
Achilles
1
Komentar terakhir saya dibahas di sini: stackoverflow.com/questions/23232671/…
Achilles
14

Jika Anda menggunakan XmlDocument dan XmlNode.

Mengatakan:

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

Menggunakan:

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

Itu tergantung pada alat yang Anda gunakan. Tapi .// akan memilih anak apa pun, kedalaman apa pun dari node referensi.

sk
sumber
Bekerja dengan baik dalam Powershell menggunakan perintah SelectSingleNode pada node XML tertentu yang diekstrak sebelumnya.
Gizmo3399
9
//form/descendant::input[@type='submit']
luis panjang
sumber
6
tambahkan beberapa deskripsi untuk itu.
piyushj
0

Anda juga dapat melakukannya dengan pemilih css:

form#myform input[type='submit']

spasi antara elemen dalam pemilih css berarti mencari input [type = 'submit'] elemen tersebut pada kedalaman berapa pun dari induk membentuk # elemen myform

Mahsum Akbas
sumber