1. ホーム
  2. xml

[解決済み】XPath:子ノードから親ノードを取得する

2022-04-06 07:11:16

質問

子ノードの親ノードを取得する必要があります。 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>

どのように解決するのですか?

を使用します。 parent を親ノードの名前で指定します。

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

このXPathは、親ノードが store .

しかし、これらのいずれかを使用することもできます。

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

これらのxpathは、任意の親ノードを選択します。したがって、ドキュメントが変更された場合、それが期待したノードでなくても、常にノードを選択することになります。

EDIT

与えられた例の中で、親が自転車でありながら、親の親が店舗である場合はどうなるのでしょうか?

上昇するのか?

にマッチするノードの親である場合のみ、ストアを選択します。 //*[title="50"] .

そうでない場合、このような場合にascentして、そのような親がいなければNoneを返す方法はないでしょうか?

はい。 ancestor

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

にマッチするノードのすべての祖先を選択します。 //*[title="50"] であり、` store' である。例

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