XPath : 자식 노드에서 부모 노드 가져 오기


157

자식 노드의 부모 노드가 필요합니다 title 50

지금은 내가 사용하고 있습니다

//*[title="50"]

부모를 어떻게 구할 수 있습니까? 결과는 store노드 여야 합니다.


<?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>

답변:


296

부모 노드 이름과 함께 parent좌표축 을 사용하십시오 .

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

이 XPath는 부모 노드 인 경우에만 선택합니다 store.

하지만이 중 하나를 사용할 수도 있습니다

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

이 xpath는 모든 상위 노드를 선택합니다. 따라서 문서가 변경되면 원하는 노드가 아닌 경우에도 항상 노드를 선택합니다.

편집하다

부모가 자전거이지만 부모의 부모가 상점 인 예에서 어떤 일이 발생합니까?

오르나요?

아니요, 일치하는 노드의 부모 인 경우에만 저장소를 선택합니다 //*[title="50"].

그렇지 않은 경우 그러한 경우 상승하는 방법이 있습니까? 그런 부모가없는 경우 None을 반환합니까?

예, ancestor축을 사용할 수 있습니다

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

이것은 노드가 일치 //*[title="50"]하는 노드의 모든 조상을 저장합니다. 예 :

<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>

XPath 선택 결과


7
당신은 또한 사용할 수 parent::*축약 구문 ..(예 //*[title="50"]/..: 또는 중첩 된 조건 (예) //*[*[title="50"]])
다니엘 헤일리


3
또는 parent::node()바로 가기에 해당 ..하며 내 의견으로는 더 좋습니다. 실제로 parent::*축의 주요 노드 유형으로 제한되며 대부분의 경우 문제가되지 않습니다.
Ludovic Kuty

3
try .xpath('..')또는xpath('parent::node()')
briankip을

"이 XPath는 상점 인 경우에만 상위 노드를 선택합니다." -부모가 bicycle있지만 부모의 부모가있는 예제에서 어떤 일이 발생 store합니까? 오르나요? 그렇지 않은 경우, 그러한 경우에 상승하고 None그러한 부모가없는 경우 반환 하는 방법이 있습니까?
마틴 토마

31

대안으로을 사용할 수 있습니다 ancestor.

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

parent조부모 나 증조부모도 얻을 수있는 것보다 더 강력합니다


20
"더 강력"하지 않습니다. 그냥 다릅니다. 따라서 축의 선택은 사용 사례에 따라 다릅니다.
Ludovic Kuty

11

식 끝에 두 개의 점을 사용할 수도 있습니다. 이 예를보십시오 :

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

2

자주 묻는 질문에 대한 새롭고 개선 된 답변 ...

부모를 어떻게 구할 수 있습니까? 결과는 store노드 여야 합니다.

parent::또는 ancestor::축 대신 술어를 사용하십시오.

여기에서 대부분의 답변은를 선택한 title다음 대상 부모 또는 조상 ( store) 요소로 이동합니다. 보다 간단하고 직접적인 접근 방식은 처음에 부모 또는 조상 요소를 직접 선택하여 a parent::또는 ancestor::축 으로 이동하지 않아도됩니다 .

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

중재 요소의 이름이 다른 경우 :

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

또는 이름과 깊이에서 :

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

이것은 질문에 대답하지 않습니다. 저자는 반드시 부모 이름을 미리 알 필요는 없습니다.
Kenn Sebesta

1
@KennSebesta : 귀하의 우려를 해결하기 위해 답변을 업데이트했습니다. 이의 제기가 해결 된 경우 공감대를 삭제하거나 답변에 문제가 있다고 생각되면 알려주십시오. 감사.
kjhughes

0

이것은 내 경우에 작동합니다. 나는 당신이 그것에서 의미를 추출 할 수 있기를 바랍니다.

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.