XPath chính xác để chọn các thuộc tính có chứa foo foo là gì?


176

Với XML này, XPath trả về tất cả các phần tử có propthuộc tính chứa Foo(ba nút đầu tiên):

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

1
Tại sao mọi người nhìn vào thuộc tính "prop"? Tôi đã bỏ lỡ một cái gì đó? Nó chỉ nói có được ba nút đầu tiên.

6
Mọi người đang nhìn vào thuộc tính prop vì đó là những gì được hỏi. Nhận tất cả các nút trong đó prop chứa "Foo". Thêm <a prop="Foo5" /> và bạn sẽ thấy lý do tại sao nó không chỉ là "ba nút đầu tiên" ..
erlando

Câu hỏi trong cơ thể được diễn đạt kém, bất kể tiêu đề. Foo có thể thực sự ở bất kỳ thuộc tính prop nào không, hay bạn thực sự chỉ muốn ba nút đầu tiên?

3
Có, tham khảo tiêu đề xin vui lòng (và cảm thấy tự do để chỉnh sửa).
ripper234

Nếu bạn cần so sánh không phân biệt chữ hoa chữ thường, hãy tìm find-an-Element-
who-property

Câu trả lời:


307
//a[contains(@prop,'Foo')]

Hoạt động nếu tôi sử dụng XML này để lấy lại kết quả.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Chỉnh sửa: Một điều cần lưu ý là trong khi XPath ở trên sẽ trả về câu trả lời đúng cho xml cụ thể đó, nếu bạn muốn đảm bảo bạn chỉ nhận được các phần tử "a" trong phần tử "bla", bạn cũng nên sử dụng các phần tử khác đã đề cập

/bla/a[contains(@prop,'Foo')]

Điều này sẽ tìm kiếm cho bạn tất cả các phần tử "a" trong toàn bộ tài liệu xml của bạn, bất kể được lồng trong phần tử "blah"

//a[contains(@prop,'Foo')]  

Tôi đã thêm điều này vì mục đích kỹ lưỡng và trên tinh thần stackoverflow. :)


3
xmlme.combây giờ chuyển hướng đến một số máy chủ khác và không xuất hiện để lưu trữ công cụ hoặc bất cứ thứ gì tương tự.
jpmc26

26

XPath này sẽ cung cấp cho bạn tất cả các nút có thuộc tính chứa 'Foo' bất kể tên nút hoặc tên thuộc tính:

//attribute::*[contains(., 'Foo')]/..

Tất nhiên, nếu bạn quan tâm nhiều hơn đến nội dung của thuộc tính và không nhất thiết là nút cha của chúng, chỉ cần bỏ / ..

//attribute::*[contains(., 'Foo')]

2
Đối với tất cả các nút//@*[contains(., 'Foo')]
aliopi 17/03/2017

16
descendant-or-self::*[contains(@prop,'Foo')]

Hoặc là:

/bla/a[contains(@prop,'Foo')]

Hoặc là:

/bla/a[position() <= 3]

Phân tích:

descendant-or-self::

Trục - tìm kiếm thông qua mọi nút bên dưới và chính nút đó. Nó thường là tốt hơn để nói điều này hơn //. Tôi đã gặp một số triển khai trong đó // có nghĩa là bất cứ nơi nào (người quyết định hoặc tự của nút gốc). Cái khác sử dụng trục mặc định.

* or /bla/a

Thẻ - kết hợp ký tự đại diện và / bla / a là một đường dẫn tuyệt đối.

[contains(@prop,'Foo')] or [position() <= 3]

Điều kiện trong []. @prop là viết tắt cho thuộc tính :: prop, vì thuộc tính là một trục tìm kiếm khác. Ngoài ra, bạn có thể chọn 3 đầu tiên bằng cách sử dụng hàm vị trí ().


6

John C là gần nhất, nhưng XPath phân biệt chữ hoa chữ thường, vì vậy XPath đúng sẽ là:

/bla/a[contains(@prop, 'Foo')]

4

Bạn đã thử một cái gì đó như:

// a [chứa (@prop, "Foo")]

Tôi chưa bao giờ sử dụng chức năng chứa trước đó nhưng nghi ngờ rằng nó sẽ hoạt động như quảng cáo ...


@toddk ... bạn đã nhắm mục tiêu một thuộc tính không tồn tại: @foo. Bạn muốn nhắm mục tiêu @prop ;-)
Metro Smurf

4

Nếu bạn cũng cần khớp nội dung của chính liên kết, hãy sử dụng text ():

//a[contains(@href,"/some_link")][text()="Click here"]



1

Đối với mã ở trên ... // * [chứa (@ prop, 'foo')]


đây là cho bất kỳ phần tử nào có foo in, nhưng thuộc tính phải là "prop"
digiguru

1

thử cái này:

// a [chứa (@ prop, 'foo')]

nên hoạt động cho bất kỳ thẻ "a" nào trong tài liệu

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.