2010-07-08 36 views
76

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

mẫu dữ liệu XML:

<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ờ, bằng cách sử dụng XPath:

//ccc[.='qwerty'] 

tôi nhận được đúng, dự kiến ​​ kết quả:

Name Value 
ccc  qwerty 

Bây giờ, bằng cách sử dụng XPath :

//aaa[.='qwerty'] 

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

Name Value 
aaa  
aaa  qwerty 

Và những gì tôi đặc biệt quan tâm, là làm thế nào để chọn yếu tố bất kỳ với giá trị đó

XPath:

//*[.='qwerty'] 

Tôi rất lạ bất ngờ kết quả:

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à làm thế nào để sửa chữa các biểu thức XPath của tôi để có được kết quả mong đợi nhiều hơn?

+0

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 **] (http://stackoverflow.com/a/34595441/290085) để tìm hiểu lý do. – kjhughes

Trả lời

126

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

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

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

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

Trên đây chọn tất cả các phần tử trong tài liệu đó có ít nhất một con text-nút 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'.

+0

Cảm ơn! Điều đó hoạt động .. Tôi không biết về văn bản() .. định nghĩa của nó là gì? – developer

+3

@iHeartGreek: Rất vui khi nó hoạt động. Làm thế nào về việc chấp nhận/upvoting?'text()' là một trong những nút * có thể có * trong XPath, có nghĩa là "đây có phải là một nút văn bản không?". Các nodetests khác là 'comment()', 'processing-instruction()', hoặc chỉ 'node()'. –

12

Hãy thử

//*[text()='qwerty']. là bạn hiện yếu tố

+1

Cảm ơn! Điều đó hoạt động .. Tôi không biết về văn bản() .. định nghĩa của nó là gì? – developer

Các vấn đề liên quan