Bir öğenin n'inci örneğini almak için XPath sorgusu


135

inputAynı sabit idözniteliğe sahip birkaç öğeye sahip bir HTML dosyası (içeriği kontrol etmiyorum) var "search_query". Dosyanın içeriği değişebilir, ancak her zaman inputid özniteliği olan ikinci öğeyi almak istediğimi biliyorum "search_query".

Bunu yapmak için bir XPath ifadesine ihtiyacım var. Denedim //input[@id="search_query"][2]ama bu işe yaramıyor. İşte bu sorgunun başarısız olduğu örnek bir XML dizesi:

<div>
  <form>
    <input id="search_query" />
   </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

<div>
  <form>
    <input id="search_query" />
  </form>
</div>

Yukarıdakilerin sadece bir örnek olduğunu ve diğer HTML kodunun oldukça farklı inputolabileceğini ve öğelerin tutarlı bir belge yapısına sahip olmayan herhangi bir yerde görünebileceğini unutmayın (hariç, her zaman inputid özniteliğine sahip en az iki öğe olacağı garanti edilir . "search_query").

Doğru XPath ifadesi nedir?


Güzel soru +1. Sorunun tam bir açıklaması ve istenen çözüm için cevabımı görün.
Dimitre Novatchev

7
Küçük nokta: asla belirli bir kimliğe sahip birden fazla öğeye sahip olmamalısınız (ve bu nedenle sorudaki HTML aslında geçersiz). Pratikte, tarayıcılar zaten bunu yapmanıza izin verecektir, ancak bunu yaparsanız, kimlik kullanmanın tek avantajını kaçırırsınız, bu da "ben benzersizim" sinyalini verir (sınıflar, benzersiz göstericiler).
machineghost

Yanıtlar:


244

Bu bir SSS :

//somexpression[$N]

vasıta "tarafından seçilen her düğümü bulun //somexpressionyani $Nüst biriminin inci çocuk".

Ne istiyorsun :

(//input[@id="search_query"])[2]

Unutmayın : []Operatör //kısaltmadan daha yüksek önceliğe (önceliğe) sahiptir .


6
Bu yanıtı beğendim. Bir öncelik meselesini düşünmemiştim (basit soldan sağa önceliği varsaydım).
rlandster

10
@rlandster: "Öncelik" kelimesi kafa karıştırıcı olabilir. //input[@id='search_query'][2]/descendat-or-self::node()/child::input[attribute::id='search_query'][position()=2]

21
Buraya Google'dan gelenler için - numaralandırma 1'den başlar - [1] ilk öğe vb.
Jan Mares

Bu XPath sorgularında bu tür dizilerin 1 ile başlaması beni şaşırttı.
Ivotje50

@ Ivotje50 Evet XPath dizileri ve dizileri 1 tabanlı
Dimitre Novatchev

21

Bu işe yarıyor gibi görünüyor:

/descendant::input[@id="search_query"][2]

Bunu Michael Kay'ın "XSLT 2.0 ve XPath 2.0 Programcı Referansı, 4. Baskı" dan yapıyorum.

Ayrıca XML Yolu Dili belirtiminin http://www.w3.org/TR/xpath/#path-abbrev ile ilgili bir ipucu sağlayan "Kısaltılmış Sözdizimi" bölümünde de bir not vardır .


Bu cevap için çok teşekkürler. Benim durumumda, xpath'i robot çerçevesinde kullandığım için kabul edilen çözüm işe yaramayacaktı, bu da parantezle başlayan yolları kabul etmiyordu. Ancak bu hile yapmalı
dahui
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.