2010-10-14 32 views
9

Tôi không thể nhận được biểu thức xpath sau đây để hoạt động khi tiền tố không gian tên đường dẫn xml được đặt.biểu thức xpath từ xml với tiền tố không gian tên

/bk:BookStore/bk:Books/bk:Book[text()='Time Machine']

XML là:

<BookStore xmlns:bk="http://www.bookstore.com/book#"> 
    <bk:Books> 
    <bk:Book id="1">Time Machine></bk:Book> 
    </bk:Books> 
</bk:BookStore> 
+0

Đăng mã thực thi truy vấn XPath. – Tomalak

+3

Bạn cần chuyển tiếp tiền tố/namespace-URI liên kết với công cụ XPath của bạn. Tại sao? Vì tiền tố không quan trọng đối với kiểm tra tên, nhưng URI không gian tên là. Vì vậy, 'a: node' có thể chọn 'b: node' miễn là tiền tố' a' và 'b' được gắn vào cùng một không gian tên URI. –

Trả lời

12

Nếu không có thêm thông tin về ngôn ngữ chủ (trong đó bạn cố gắng để đánh giá biểu thức XPath) nó không thể cung cấp một khuyến nghị hữu ích.

Nói chung, một người cần "đăng ký" một không gian tên với trình quản lý không gian tên và điều này cũng liên kết tiền tố với không gian tên đã đăng ký. Sau đó, sử dụng đối tượng NamespaceManager này làm đối số cho phương thức đánh giá XPath, người ta có thể chỉ định làm đối số cho phương thức này một biểu thức XPath có chứa các tên được đặt trước bằng tiền tố cụ thể đó.

Cách giải quyết:

/*/*[name()='bk:Books']/*[name()='bk:Book' and text()='Time Machine'] 
+0

Tôi đang sử dụng chữ ký xml trong java. Tôi muốn chọn các phần tử được ký bằng cách sử dụng xpath trong phần trasnforms. Làm cách nào để cung cấp biểu thức xpath khi tôi có tiền tố và không gian tên trong tài liệu xml của mình. – Ashwin

+1

@Ashwin: Câu trả lời này cho thấy chính xác cách thực hiện điều này (một trong những cách có thể), mà không cần đăng ký không gian tên. Cách thứ hai có thể là đăng ký không gian tên cho các ràng buộc tiền tố trong đó các tên phần tử được tham chiếu trong biểu thức XPath là - sau đó biểu thức XPath có thể chứa các tiền tố và dễ đọc hơn. Cách thứ hai này yêu cầu sử dụng cho không gian tên đăng ký các API được cung cấp thực hiện và cần phải đọc tài liệu thích hợp. –

24

Hoặc thậm chí tốt hơn (và nhiều hơn nữa xách tay), không có tiền tố cần thiết:

/*/*[local-name()='Books'] ... and so on 

The function local-name bỏ qua bất kỳ tiền tố, trong đó, như đã nêu một cách chính xác bằng cách bình luận, có thể thay đổi.

+1

Tại sao một người nào đó downvote này? Tôi thấy đây là một giải pháp tuyệt vời để tránh đối phó với các không gian tên, điều này chỉ gây phiền toái và không cần thiết 99% thời gian. – Arne

+0

Nếu các không gian tên chỉ là một rào cản bạn phải vượt qua, áp đặt cho bạn bên ngoài - như chúng thường - thì đây chắc chắn là con đường để đi. – joachim

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