2011-11-19 45 views
8

Đối với another question Tôi đã tạo một số mã liên quan đến XML hoạt động trên máy phát triển của mình chứ không phải trên bảng mã viper nơi tôi đã thử nghiệm trước khi thêm vào câu trả lời của mình.Thứ tự kết quả truy vấn XPath

Tôi có thể giảm vấn đề của mình đến mức thứ tự các nút được trả về bởi DOMXPath::query() khác giữa hệ thống của tôi và bảng mã.

XML: <test>This is some <span>text</span>, fine.</test>

Khi tôi truy vấn tất cả textnodes //child::text() kết quả khác:

Viper Codepad:

#0: This is some 
#1: , fine. 
#2: text 

Máy của tôi:

#0: This is some 
#1: text 
#2: , fine. 

Tôi không có kinh nghiệm với xpath mà tôi hiểu tại sao điều này xảy ra và làm thế nào nó có thể ảnh hưởng đến thứ tự trả lại với việc thực hiện PHP.

Edit:

thử nghiệm Hơn nữa đã tiết lộ rằng LIBXML_VERSION khác nhau giữa hai hệ thống:

Viper Codepad: 20626 (2.6.26; 6 Jun 2006) 
My Machine...: 20707 (2.7.7; 15 Mar 2010) 

Trả lời

4

Tôi có thể tìm thấy báo cáo lỗi sau trông giống như vấn đề: Bug 363252 - proximity position in libxml2's xmlXPathEvalExpression() báo cáo ngày 18 tháng 10 năm 2006 và xác nhận có niên đại từ tháng 5 năm 2006 trước phiên bản 2.6.26 được đề cập.

Điều này phải được sửa trong libxml2 2.6.27.

+1

+1 - cảm ơn, nó đã tiết kiệm thời gian cho tôi – Vitaliy

2

Nó trông giống như một lỗi trong 20.626 phiên bản:

Nó xử lý đầu tiên tất cả các văn bản con các nút theo thứ tự tài liệu, sau đó là nội dung của các nút phần tử con. Nên là kết quả trên máy của bạn

+1

Mặc dù đó là giải thích có khả năng nhất theo Occam, nên có báo cáo lỗi hoặc chỉ báo trong danh sách thay đổi libxml rồi xác minh điều đó. – Gordon

+0

Bạn lấy thông tin đó từ đâu? Nếu bạn có thể, xin vui lòng thêm một liên kết đến một số tài nguyên chính thức xin vui lòng. – hakre

+0

Nó chỉ là giả định của tôi rằng đây là một vấn đề - bởi vì xpath kết quả trong thứ tự các nút không chính xác. Hiện tại tôi chỉ tìm thấy [this] (http://mail.gnome.org/archives/xml/2008-November/msg00112.html), nhưng nó không liên quan. Và có thể [this] (http://mail.gnome.org/archives/xml/2005-May/msg00035.html) cũng – Vitaliy

1

Dường như Viper Codepad không trả lại các nút được chọn theo thứ tự chiều sâu đầu tiên, nhưng thực hiện đánh giá đầu tiên.

Nó được cho là độ sâu đầu tiên.

Saxon, MSXML, Altova XML từng trả về kết quả theo thứ tự độ sâu đầu tiên.

2

XPath là ngôn ngữ truy vấn, do đó, nó chỉ nên đọc cấu trúc của tài liệu .xml và không bao giờ sửa đổi nó. Điều này bao gồm thứ tự nút. Trong ví dụ đầu tiên của bạn tuy nhiên điều này là không đúng sự thật. Vì vậy, đây chắc chắn là một lỗi theo this.

+0

Vâng, đó là những gì tôi nghĩ là tốt, hoặc ít nhất là cách tôi hiểu thuật ngữ * Thứ tự tài liệu * trong định nghĩa xpath. – hakre

7

Về mặt kỹ thuật XPath 1.0 trả về các tập hợp nút thay vì chuỗi nút. Trong đặc tả XPath 1.0 không có câu lệnh nào về thứ tự của các bộ nút này - thực ra, là các bộ, chúng không có thứ tự nội tại. Tuy nhiên, XSLT 1.0 luôn xử lý các bộ nút được trả về bởi XPath 1.0 theo thứ tự tài liệu, và vì tiền lệ đó, có một kỳ vọng rộng rãi rằng các kết quả XPath sẽ theo thứ tự tài liệu khi XPath được gọi từ các ngôn ngữ khác với XSLT. . Tuy nhiên, không có gì trong spec để đảm bảo điều này. Trong XPath 2.0 kỳ vọng của người dùng sẽ trở thành một phần của đặc tả, và kết quả của biểu thức đường dẫn PHẢI nằm trong thứ tự tài liệu.

+0

+1 cho câu trả lời đúng và có nhiều thông tin. –

+0

libxml2 tuân thủ quy ước theo thiết kế để luôn trả về theo thứ tự tài liệu. Ngay cả đối với các thuộc tính ví dụ mà không cần phải có một đơn đặt hàng là tốt. – hakre

+1

@Michael Kay: Còn lệnh với các vị từ thì sao? Không XPath 1.0 chỉ định các tập hợp nút nằm trong thứ tự tài liệu? http://www.w3.org/TR/xpath/#predicates – hakre

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