Làm cách nào để chọn các phần tử con có độ sâu bất kỳ bằng XPath?


101

Giả sử tôi có điều này (đơn giản hóa):

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

Sau đó, tôi có thể chọn nút gửi bằng XPath //form[@id='myform']/input[@type='submit']. Tuyệt quá.

Tuy nhiên, các mẫu của tôi có thể thay đổi và tôi muốn linh hoạt về độ sâu nơi đặt nút gửi. Nó có thể được đặt trong một cái bàn, như thế này:

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

Tôi biết tôi có thể chọn các phần tử là cháu, nhưng tôi không thể chọn grand-grand-grand -...- childeren ở bất kỳ độ sâu nào. Ví dụ:

  • //form[@id='myform']/*/input[@type='submit'] chỉ chọn những đứa trẻ lớn, không có chiều sâu hơn nữa.
  • //form[@id='myform']/*/*/input[@type='submit'] chỉ chọn những ông-bà-con, không sâu hơn hay kém hơn.
  • //form[@id='myform']/**/input[@type='submit'] không hợp lệ.

Vì vậy, làm cách nào để chọn nút gửi này một cách đáng tin cậy mà không cần sử dụng ID phần tử?

Câu trả lời:


157

Bạn đã gần tới. Chỉ cần sử dụng:

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

Các //phím tắt cũng có thể được sử dụng bên trong một biểu thức.


C # dường như không hiểu ký hiệu này. //form//inputtrả về null trong C # trong khi Chrome có thể tìm thấy 35 đầu vào bằng cách sử dụng cùng một xpath
Achilles

1
Nhận xét cuối cùng của tôi được thảo luận ở đây: stackoverflow.com/questions/23232671/…
Achilles

14

Nếu bạn đang sử dụng XmlDocument và XmlNode.

Nói:

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

Sử dụng:

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

Nó phụ thuộc vào công cụ mà bạn sử dụng. Nhưng .// sẽ chọn bất kỳ con nào, bất kỳ độ sâu nào từ một nút tham chiếu.


Hoạt động tốt trong Powershell bằng cách sử dụng lệnh SelectSingleNode trên một nút XML nhất định được trích xuất trước đó.
Gizmo3399

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

6
thêm một số mô tả vào nó.
piyushj

0

Ngoài ra, bạn có thể làm điều đó với các bộ chọn css:

form#myform input[type='submit']

khoảng trắng giữa các phần tử trong css elector có nghĩa là tìm kiếm đầu vào [type = 'submit'] các phần tử đó ở bất kỳ độ sâu nào của biểu mẫu mẹ # phần tử myform

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.