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ような親がいない場合に戻る方法はありますか?
マーティントーマ2017

31

代わりに、を使用できますancestor

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

それparentはそれが祖父母や偉大な偉大な祖父母をも得ることができるので、それはより強力です


20
「より強力」ではありません。ただ違うだけです。したがって、軸の選択はユースケースによって異なります。
Ludovic Kuty

11

式の最後にある2つのドットも使用できます。この例を見てください:

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

2

古いよくある質問に対する新しい改善された回答...

どうすればその親を取得できますか?結果はstoreノードでなければなりません。

parent::or ancestor::軸ではなく述語を使用する

ここでのほとんどの回答は、を選択titleしてから、ターゲットの親または祖先(store)要素までトラバースします。より単純で直接的なアプローチは、最初に親要素または祖先要素を直接選択することです。これにより、a 軸parent::またはa ancestor::軸に移動する必要がなくなります。

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

介在する要素の名前が異なる場合:

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

または、名前と深さ:

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

これは質問の答えにはなりません。著者は必ずしも事前に親の名前を知っている必要はありません。
ケンセベスタ

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.