2013-02-25 44 views
17

Tôi tin rằng điều này có thể được trả lời chỉ bằng XPath chuẩn mà không tham chiếu đến triển khai, nhưng chỉ để tham chiếu, tôi đang sử dụng các đối tượng DOM XML trong .Net (System.Xml namespace) .XPath để chọn tất cả các phần tử có tên được chỉ định

Tôi có một nút giao cho hàm của tôi, từ đâu đó sâu bên trong một tài liệu XML và tôi muốn chọn tất cả các phần tử con cháu của nút này có tên cụ thể, bất kể đường dẫn đến các nút đó. Cuộc gọi tôi là làm cho ngoại hình như thế này:

node.SelectNodes("some XPath here"); 

Nút Tôi đang làm việc với một cái gì đó trông như thế này:

... 
<food> 
    <tart> 
    <apple color="yellow"/> 
    </tart> 
    <pie> 
    <crust quality="flaky"/> 
    <filling> 
     <apple color="red"/> 
    </filling> 
    </pie> 
    <apple color="green"/> 
</food> 
... 

Những gì tôi muốn là một danh sách tất cả các nút "quả táo" , tức là 3 kết quả. Tôi đã thử một vài điều khác nhau, nhưng không ai trong số họ có được những gì tôi muốn.

node.SelectNodes("apple"); 

Điều này mang lại cho tôi một kết quả là quả táo xanh.

node.SelectNodes("*/apple"); 

Điều này mang lại cho tôi một kết quả là quả táo vàng.

node.SelectNodes("//apple"); 

Điều này mang lại cho tôi hàng trăm kết quả, giống như mọi nút táo trong tài liệu hoặc ít nhất là mỗi nút táo là con trực tiếp của thư mục gốc của tài liệu.

Làm cách nào để tạo XPath sẽ cung cấp cho tôi tất cả các nút của quả táo trong nút hiện tại của tôi, bất kể mức độ sâu dưới nút hiện tại mà chúng được tìm thấy? Cụ thể, dựa trên ví dụ của tôi ở trên, tôi sẽ nhận được ba kết quả - táo đỏ, xanh lá cây và vàng.

Trả lời

25

Hãy thử .//apple. Danh sách này liệt kê tất cả các nút apple là hậu duệ của nút hiện tại. Để hiểu rõ hơn về chủ đề này, bạn nên tìm hiểu cách các trục XPath hoạt động. Bạn cũng có thể viết descendant::apple, ví dụ.

+0

Tuyệt vời, đó chính xác là những gì tôi đang tìm kiếm. Tôi đã google trong một giờ và không thể tìm thấy điều đó. Chỉ cần làm rõ, để thấy rằng tôi hiểu cú pháp chính xác - các dấu gạch chéo kép cho tôi tất cả các nút táo bất kể độ sâu (như tôi đã thử trong câu hỏi của tôi ở trên), và dấu chấm trước khi giới hạn lựa chọn thành con cháu của nút hiện tại. Đúng không? –

+0

Vâng, đúng vậy. Tôi cũng đã chỉnh sửa bài đăng của mình để cung cấp cho bạn một số gợi ý bổ sung. – nwellnhof

+0

Bạn đã chỉnh sửa câu trả lời của mình để nói rằng tôi nên tìm hiểu cách các trục XPath hoạt động - Tôi đồng ý. Bạn có bất cứ gợi ý nào về tài nguyên tốt tôi nên kiểm tra không? –

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