XPath - Chọn các phần tử bằng một giá trị


110

Trong Xpath, tôi muốn chọn các phần tử bằng một giá trị cụ thể.

Dữ liệu XML mẫu:

<aaa id="11" >
    <aaa id="21" >
        <aaa id="31" ></aaa>
        <bbb id="32" >
            <aaa id="41" ></aaa>
            <bbb id="42" ></bbb>
            <ccc id="43" ></ccc>
            <ddd id="44" >qwerty</ddd>
            <ddd id="45" ></ddd>
            <ddd id="46" ></ddd>
        </bbb>
    </aaa>
    <bbb id="22" >
         <aaa id="33" >qwerty</aaa>
         <bbb id="34" ></bbb>
         <ccc id="35" ></ccc>
         <ddd id="36" ></ddd>
         <ddd id="37" ></ddd>
         <ddd id="38" ></ddd>
    </bbb>
    <ccc id="23" >qwerty</ccc>
    <ccc id="24" ></ccc>
 </aaa>

Bây giờ, sử dụng XPath:

//ccc[.='qwerty']

Tôi nhận được kết quả chính xác, mong đợi :

Name    Value
ccc     qwerty

Bây giờ, sử dụng XPath:

//aaa[.='qwerty']

Tôi nhận được kết quả bất ngờ :

Name    Value
aaa      
aaa     qwerty

Và điều tôi đặc biệt quan tâm là làm thế nào để chọn bất kỳ phần tử nào có giá trị đó

XPath:

//*[.='qwerty']

Tôi nhận được kết quả bất ngờ rất kỳ lạ :

Name    Value
aaa
bbb
ddd     qwerty
bbb     qwerty
aaa     qwerty
ccc     qwerty

Ai đó có thể giải thích những kết quả này và cách sửa các biểu thức XPath của tôi để có được kết quả mong đợi hơn không?


1
Vì XPath . =khác với XPath text() =. Xem các nút văn bản phù hợp khác với các giá trị chuỗi phù hợp để tìm hiểu lý do.
kjhughes

Câu trả lời:


178

Thông số XPath. xác định giá trị chuỗi của một phần tử là phần nối (theo thứ tự tài liệu) của tất cả các nút con văn bản của nó .

Điều này giải thích cho "kết quả kỳ lạ".

Kết quả "tốt hơn" có thể đạt được bằng cách sử dụng các biểu thức bên dưới:

//*[text() = 'qwerty']

Ở trên chọn mọi phần tử trong tài liệu có ít nhất một nút con văn bản với giá trị 'qwerty'.

//*[text() = 'qwerty' and not(text()[2])]

Ở trên chọn mọi phần tử trong tài liệu chỉ có một nút con văn bản và giá trị của nó là: 'qwerty'.


3
@iHeartGreek: Rất vui vì nó hoạt động. Làm thế nào về việc chấp nhận / ủng hộ? text()là một trong những thử nghiệm nút có thể có trong XPath, nghĩa là "đây có phải là nút văn bản không?". Nodetests khác comment(), processing-instruction()hoặc chỉ node().
Dimitre Novatchev

15

Thử

//*[text()='qwerty']bởi vì yếu tố hiện tại. của bạn

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.