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?

Jawaban:


157

Kamu hampir sampai. Cukup gunakan:

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

Itu // shortcut juga dapat digunakan dalam ekspresi.


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.


Bekerja dengan baik dalam Powershell menggunakan perintah SelectSingleNode pada node XML tertentu yang diekstrak sebelumnya.
Gizmo3399


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.