2009-02-17 34 views
15
<Document> 
    <A> 
    <B> 
     <C></C> 
    </B> 
    </A> 
    <E> 
    <F> 
    <C></C> 
    </F> 
    <G> 
    <C></C> 
    </G> 
</E> 
</Document> 

Nếu tôi nạp XML trên vào một XmlDocument và làm một SelectSingleNode trên A bằng cách sử dụng truy vấn XPath // CSelectNodes XPath trong .NET

 
XmlNode oNode = oDocument.SelectSingleNode("E"); 
XmlNodeList oNodeList = oNode.SelectNodes("//C"); 

tại sao nó trở lại nút từ Under B khi những gì Tôi hy vọng sẽ xảy ra sẽ chỉ trả lại các nút từ dưới E

Có ý nghĩa?

Chỉnh sửa: Làm cách nào để tôi chỉ trả lại từ nút đó trở đi?

Trả lời

22

Đơn giản: hàng đầu // có nghĩa là "ở mọi cấp độ" trong cùng một tài liệu làm nút được chọn.

Từ spec:

  • // para chọn tất cả các hậu duệ của para gốc tài liệu và do đó sẽ chọn tất cả các yếu tố para trong tài liệu tương tự như nút bối cảnh
  • .//para chọn para phần tử con cháu của nút ngữ cảnh
11

Chỉ định .//C sẽ đạt được những gì bạn muốn, nếu không, XPath bắt đầu từ gốc tài liệu thay vì nút hiện tại.

Sự nhầm lẫn là trong định nghĩa của // từ XPath standard như sau:

// là viết tắt của /hậu duệ-or-self :: node() /. Đối với ví dụ , // para viết tắt là /hậu duệ hoặc tự :: nút()/con :: para và do đó sẽ chọn bất kỳ phần tử para nào trong tài liệu (ngay cả phần tử para là phần tử tài liệu sẽ được chọn bởi // para vì phần tử tài liệu là nút con của nút gốc); div // para là viết tắt của div/hậu duệ hoặc tự :: nút()/child :: para và vì vậy sẽ chọn tất cả para hậu duệ của trẻ em div.

// là viết tắt của /descendant-or-self::node()/ nó bắt đầu ở cấp tài liệu trừ khi bạn chỉ định nút lúc bắt đầu.

+0

Không, thông số nói "//" là "của gốc tài liệu" và ".//" là của nút ngữ cảnh. Việc thực hiện là chính xác. –

+0

Tham khảo lại các trường W3: đọc kỹ: "trong tài liệu từ nút hiện tại" - nút ngữ cảnh được sử dụng (chỉ) để lấy tài liệu; sau đó toàn bộ tài liệu được quét. –

+0

Có, tôi đã cập nhật nó để tham khảo tiêu chuẩn XPath và làm nổi bật nơi sự nhầm lẫn nằm. Cảm ơn. :) –

6

//C là tất cả các nút C trong toàn bộ tài liệu

/E//C sẽ chỉ nút C dưới E

/C sẽ chỉ gốc C nút

Xem xpath syntax reference

3

Trong XPATH Specification bạn sẽ tìm thấy dưới 2.5 tuyên bố sau:

// para chọn tất cả các para hậu duệ của các tài liệu gốc và do đó sẽ chọn tất cả các yếu tố para trong cùng một tài liệu là nút bối cảnh

tức là hành vi bạn quan sát là hợp lệ. Bạn nên làm một cái gì đó như "/ E // C"

+0

Nếu tôi không biết có bao nhiêu nút sâu C? Nó cũng có thể là/E/D/G/C? –

+0

@Gordon - "/ E // C" sẽ đối phó với bất kỳ số lượng các cấp giữa E và C. –