XPath: Alt düğümünden üst düğümü al


157

Alt düğüm için üst düğümü almam gerekiyor title 50

Şu an sadece kullanıyorum

//*[title="50"]

Ebeveynini nasıl alabilirim? Sonuç storedüğüm olmalıdır .


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

Yanıtlar:


297

Üst düğümün adıyla parenteksenleri kullanın .

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

Bu XPath, üst düğümü yalnızca bir store.

Ancak bunlardan birini de kullanabilirsiniz

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

Bu xpath'ler herhangi bir üst düğümü seçecektir. Dolayısıyla belge değişirse, beklediğiniz düğüm olmasa bile her zaman bir düğüm seçersiniz.

DÜZENLE

Ebeveynin bisiklet olduğu, ancak ebeveynin ebeveyninin mağaza olduğu verilen örnekte ne olur?

Yükseliyor mu?

Hayır, yalnızca eşleşen düğümün bir ebeveyni ise mağazayı seçer //*[title="50"].

Değilse, bu gibi durumlarda yükselme ve böyle bir ebeveyn yoksa Yok'u döndürme yöntemi var mı?

Evet, ancestoreksenleri kullanabilirsiniz

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

Bu, düğüm eşleşen //*[title="50"]`` depolar '' olan tüm ataları seçecektir . Örneğin

<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 seçim sonucu


7
Ayrıca kullanabilirsiniz parent::*kısaltılmış sözdizimi ..: (örnek //*[title="50"]/..: veya yuvalanmış yüklemi (örnek) //*[*[title="50"]])
Daniel Haley


3
Ya parent::node()da kısayola karşılık gelen ..ve bence daha iyi. Aslında parent::*, çoğu durumda sorun olmayan eksenin ana düğüm tipi ile sınırlıdır.
Ludovic Kuty

3
Eğer deneyin .xpath('..')ya daxpath('parent::node()')
briankip

"Bu XPath yalnızca bir düğüm ise üst düğümü seçer." - ve ebeveyn olduğu Verilen örnekte neler olduğunu bicycleancak ebeveyn üstüdür store? Yükseliyor mu? Değilse, bu gibi durumlarda yükselmek ve Noneböyle bir ebeveyn yoksa geri dönmek için bir yöntem var mı?
Martin Thoma

31

Alternatif olarak kullanabilirsiniz ancestor.

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

Daha Daha güçlü parenthatta dedesi veya büyük büyük büyükbaba alabilirsiniz beri


20
"Daha güçlü" değil. Sadece farklı. Bu nedenle eksenin seçimi kullanım durumuna bağlıdır.
Ludovic Kuty

11

İfadenin sonundaki iki noktayı da kullanabilirsiniz. Bu örneğe bakın:

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

2

Eski, sık sorulan bir soruya yeni, geliştirilmiş cevap ...

Ebeveynini nasıl alabilirim? Sonuç storedüğüm olmalıdır .

parent::Veya ancestor::ekseni yerine yüklem kullanın

Buradaki yanıtların çoğu title, hedeflenen üst veya ata ( store) öğesini seçer ve ardından yukarı doğru hareket eder . Daha basit, doğrudan bir yaklaşım, ana öğeyi veya ata öğesini doğrudan ilk etapta seçerek a parent::veya ancestor::eksenlere geçme ihtiyacını ortadan kaldırır :

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

Araya giren elemanların adı farklıysa:

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

Veya isim ve derinlik olarak:

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

Bu soruya cevap vermiyor. Yazar, üst adı önceden mutlaka bilmek zorunda değildir.
Kenn Sebesta

1
@KennSebesta: Endişenizi gidermek için cevabı güncelledim. İtirazınız ele alındıysa lütfen aşağı oyunuzu kaldırın veya yanıtta bir sorun olduğunu düşünüyorsanız bana bildirin. Teşekkürler.
kjhughes

0

Bu benim durumumda işe yarıyor. Umarım bundan anlam çıkarabilirsin.

//div[text()='building1' and @class='wrap']/ancestor::tr/td/div/div[@class='x-grid-row-checker']
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.