wake-up-neo.net

XPath: Abrufen des übergeordneten Knotens vom untergeordneten Knoten

Ich brauche den übergeordneten Knoten für den untergeordneten Knoten "Titel 50".

Im Moment verwende ich nur

//*[title="50"]

Wie kann ich das übergeordnete Element erhalten? Das Ergebnis sollte der store-Knoten sein.


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

Verwenden Sie die parent-Achsen mit dem Namen des übergeordneten Knotens.

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

Dieser XPath wählt den übergeordneten Knoten nur aus, wenn es sich um eine store handelt. 

Sie können aber auch eine davon verwenden

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

Diese xpaths wählen einen übergeordneten Knoten aus. Wenn sich also das Dokument ändert, wählen Sie immer einen Knoten aus, selbst wenn es nicht der erwartete Knoten ist.

EDIT

Was passiert in dem gegebenen Beispiel, in dem das Elternteil Fahrrad ist, während das Elternteil des Elternteils ein Geschäft ist? 

Aufstieg 

Nein, es wird nur das Geschäft ausgewählt, wenn es ein übergeordnetes Element des Knotens ist, der mit //*[title="50"] übereinstimmt.

Wenn nicht, gibt es eine Methode, um in solchen Fällen aufzusteigen und None zurückzugeben, wenn es keine solchen Eltern gibt?

Ja, Sie können ancestor-Achsen verwenden

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

Dadurch werden alle Vorfahren des Knotens ausgewählt, die mit //*[title="50"] übereinstimmen und stores sind. Z.B.

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

202
René Link

Als Alternative können Sie ancestor verwenden.

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

Es ist mächtiger als parent, da es sogar Großeltern oder Urgroßeltern bekommen kann

22
Aminah Nuraini

Sie können auch die beiden Punkte am Ende des Ausdrucks verwenden. Siehe dieses Beispiel:

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

Das funktioniert in meinem Fall. Ich hoffe, Sie können daraus Bedeutungen gewinnen.

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
0