XPath: Nhận nút cha từ nút con


157

Tôi cần lấy nút cha cho nút con title 50

Hiện tại tôi chỉ đang sử dụng

//*[title="50"]

Làm thế nào tôi có thể có được cha mẹ của nó? Kết quả phải là storenút.


<?xml version="1.0" encoding="utf-8"?>
<d:data xmlns:d="defiant-namespace" d:mi="23">
    <store d:mi="22">
        <book price="12.99" d:price="Number" d:mi="4">
            <title d:constr="String" d:mi="1">Sword of Honour</title>
            <category d:constr="String" d:mi="2">fiction</category>
            <author d:constr="String" d:mi="3">Evelyn Waugh</author>
        </book>
        <book price="8.99" d:price="Number" d:mi="9">
            <title d:constr="String" d:mi="5">Moby Dick</title>
            <category d:constr="String" d:mi="6">fiction</category>
            <author d:constr="String" d:mi="7">Herman Melville</author>
            <isbn d:constr="String" d:mi="8">0-553-21311-3</isbn>
        </book>
        <book price="8.95" d:price="Number" d:mi="13">
            <title d:constr="String" d:mi="10">50</title>
            <category d:constr="String" d:mi="11">reference</category>
            <author d:constr="String" d:mi="12">Nigel Rees</author>
        </book>
        <book price="22.99" d:price="Number" d:mi="18">
            <title d:constr="String" d:mi="14">The Lord of the Rings</title>
            <category d:constr="String" d:mi="15">fiction</category>
            <author d:constr="String" d:mi="16">J. R. R. Tolkien</author>
            <isbn d:constr="String" d:mi="17">0-395-19395-8</isbn>
        </book>
        <bicycle price="19.95" d:price="Number" d:mi="21">
            <brand d:constr="String" d:mi="19">Cannondale</brand>
            <color d:constr="String" d:mi="20">red</color>
        </bicycle>
    </store>
</d:data>

Câu trả lời:


294

Sử dụng các parenttrục với tên của nút cha.

//*[title="50"]/parent::store

XPath này sẽ chỉ chọn nút cha nếu nó là a store.

Nhưng bạn cũng có thể sử dụng một trong những

//*[title="50"]/parent::*
//*[title="50"]/..

Các xpath này sẽ chọn bất kỳ nút cha. Vì vậy, nếu tài liệu thay đổi, bạn sẽ luôn chọn một nút, ngay cả khi đó không phải là nút bạn mong đợi.

BIÊN TẬP

Điều gì xảy ra trong ví dụ đã cho mà cha mẹ là một chiếc xe đạp nhưng cha mẹ của cha mẹ là một cửa hàng?

Nó đi lên?

Không, nó chỉ chọn cửa hàng nếu nó là cha mẹ của nút phù hợp //*[title="50"].

Nếu không, có một phương pháp để đi lên trong các trường hợp như vậy và trả về Không nếu không có cha mẹ như vậy?

Có, bạn có thể sử dụng ancestorcác trục

//*[title="50"]/ancestor::store

Điều này sẽ chọn tất cả tổ tiên của nút khớp với //*[title="50"]các cửa hàng `. Ví dụ

<data xmlns:d="defiant-namespace" d:mi="23">
    <store mi="1">
        <store mi="22">
            <book price="8.95" d:price="Number" d:mi="13">
                <title d:constr="String" d:mi="10">50</title>
                <category d:constr="String" d:mi="11">reference</category>
                <author d:constr="String" d:mi="12">Nigel Rees</author>
            </book>
        </store>
    </store>
</data>

Kết quả lựa chọn XPath


7
Bạn cũng có thể sử dụng parent::*cú pháp viết tắt ..(ví dụ //*[title="50"]/..:) hoặc một vị từ lồng nhau (ví dụ //*[*[title="50"]]:)
Daniel Haley


3
Hoặc parent::node()tương ứng với các phím tắt ..và theo tôi là tốt hơn. Trong thực tế, parent::*giới hạn ở loại nút chính của trục mà trong hầu hết các trường hợp không phải là vấn đề.
Ludovic Kuty

3
Nếu bạn đang sử dụng thử .xpath('..')hoặcxpath('parent::node()')
briankip

"XPath này sẽ chỉ chọn nút cha nếu đó là một cửa hàng." - và những gì xảy ra trong ví dụ đã cho, nơi cha mẹ là bicyclenhưng cha mẹ của cha mẹ là store? Nó đi lên? Nếu không, có một phương pháp để đi lên trong các trường hợp như vậy và trở lại Nonenếu không có cha mẹ như vậy?
Martin Thoma

31

Chỉ là một thay thế, bạn có thể sử dụng ancestor.

//*[title="50"]/ancestor::store

Nó mạnh hơn parentkể từ khi nó có thể có được cả ông bà hay ông bà tuyệt vời


20
Nó không "mạnh hơn". Nó chỉ khác nhau. Do đó, sự lựa chọn của trục phụ thuộc vào trường hợp sử dụng.
Ludovic Kuty

11

Bạn cũng có thể sử dụng hai dấu chấm ở cuối biểu thức. Xem ví dụ này:

//*[title="50"]/..

2

Câu trả lời mới, được cải thiện cho một câu hỏi cũ, thường được hỏi ...

Làm thế nào tôi có thể có được cha mẹ của nó? Kết quả phải là storenút.

Sử dụng một vị ngữ chứ không phải parent::hoặc ancestor::trục

Hầu hết các câu trả lời ở đây chọn titlevà sau đó đi qua storephần tử cha hoặc tổ tiên ( ) được nhắm mục tiêu . Cách tiếp cận trực tiếp, đơn giản hơn là chọn phần tử cha hoặc tổ tiên trực tiếp ở vị trí đầu tiên, tránh sự cần thiết phải đi qua một parent::hoặc một ancestor::trục:

//*[book/title = "50"]

Nếu các yếu tố can thiệp khác nhau trong tên:

//*[*/title = "50"]

Hoặc, trong tên và độ sâu:

//*[.//title = "50"]

Điều này không trả lời câu hỏi. Tác giả không nhất thiết phải biết tên cha mẹ trước thời hạn.
Kenn Sebesta

1
@KennSebesta: Tôi đã cập nhật câu trả lời để giải quyết mối quan tâm của bạn. Vui lòng xóa downvote của bạn nếu phản đối của bạn đã được giải quyết, hoặc cho tôi biết nếu bạn cảm thấy có gì đó không đúng với câu trả lời. Cảm ơn.
kjhughes

0

Điều này hoạt động trong trường hợp của tôi. Tôi hy vọng bạn có thể trích xuất ý nghĩa của nó.

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.