“Foo” içeren öznitelikleri seçmek için doğru XPath nedir?


176

Bu XML verildiğinde, XPath'ın propözniteliği Foo(ilk üç düğüm) içeren tüm öğeleri döndürür :

<bla>
 <a prop="Foo1"/>
 <a prop="Foo2"/>
 <a prop="3Foo"/>
 <a prop="Bar"/>
</bla>

1
Neden herkes "prop" özelliğine bakıyor? Bir şey mi kaçırdım? Sadece ilk üç düğümü al diyor.

6
Herkes pervane özelliğine bakıyor, çünkü sorduğu şey bu. Pervane "Foo" içeren tüm düğümleri alın. <a prop="Foo5" /> eklediğinizde, bunun neden yalnızca "ilk üç düğüm" olmadığını göreceksiniz ..
erlando

Vücuttaki soru, başlığa bakılmaksızın zayıf bir şekilde ifade edilmiştir. Foo gerçekten herhangi bir prop özelliğinde olabilir mi, yoksa sadece ilk üç düğümü istiyor musunuz?

3
Evet, lütfen başlığa bakın (ve düzenlemekten çekinmeyin).
ripper234

Büyük / küçük harfe duyarlı olmayan karşılaştırmaya ihtiyacınız varsa , özniteliği-bir-metin-büyük / küçük harfe duyarlı olmayan bir öğe bulma
Michael Freidgeim

Yanıtlar:


307
//a[contains(@prop,'Foo')]

Sonuçları geri almak için bu XML kullanırsanız çalışır.

<bla>
 <a prop="Foo1">a</a>
 <a prop="Foo2">b</a>
 <a prop="3Foo">c</a>
 <a prop="Bar">a</a>
</bla>

Düzenleme: Dikkat edilmesi gereken başka bir şey, yukarıdaki XPath belirli bir xml için doğru cevabı döndürürken, yalnızca "bla" öğesinde "a" öğelerini aldığınızdan emin olmak istiyorsanız, diğerlerinin de belirttiği gibi kullanmalısınız

/bla/a[contains(@prop,'Foo')]

Bu, bir "blah" öğesinde iç içe olmasına bakılmaksızın, tüm xml belgenizdeki tüm "a" öğelerini arayacaktır

//a[contains(@prop,'Foo')]  

Bunu iyilik ve yığın akışı ruhu için ekledim. :)


3
xmlme.comartık başka bir ana bilgisayara yönlendiriyor ve aracı veya benzeri bir şeyi barındırdığı görülmüyor.
jpmc26

26

Bu XPath, düğüm adı veya öznitelik adından bağımsız olarak 'Foo' içeren özniteliklere sahip tüm düğümleri verecektir:

//attribute::*[contains(., 'Foo')]/..

Tabii ki, özniteliğin içeriğiyle daha fazla ilgileniyorsanız ve üst düğümleri olması gerekmiyorsa, yalnızca / ..

//attribute::*[contains(., 'Foo')]

2
Tüm düğümler için//@*[contains(., 'Foo')]
aliopi

16
descendant-or-self::*[contains(@prop,'Foo')]

Veya:

/bla/a[contains(@prop,'Foo')]

Veya:

/bla/a[position() <= 3]

Dissected:

descendant-or-self::

Eksen - altındaki her düğümde ve düğümün kendisinde arama yapar. Bunu söylemek genellikle // 'den daha iyidir. // her yerde (kök düğümün yavaşlatıcı veya kendi kendine) anlamına gelen bazı uygulamalarla karşılaştım. Diğeri varsayılan ekseni kullanır.

* or /bla/a

Etiket - bir joker karakter eşleşmesi ve / bla / a mutlak bir yoldur.

[contains(@prop,'Foo')] or [position() <= 3]

[] İçindeki durum. @prop, özellik başka bir arama ekseni olduğundan, özellik :: prop için kısaltmadır. Alternatif olarak, position () işlevini kullanarak ilk 3 tanesini seçebilirsiniz.


6

John C en yakın olanıdır, ancak XPath büyük / küçük harfe duyarlıdır, bu nedenle doğru XPath şöyle olur:

/bla/a[contains(@prop, 'Foo')]

4

Gibi bir şey denediniz mi:

// a [içerir (@prop, "Foo")]

Daha önce içeren işlevi hiç kullanmadım ama reklamı yapıldığı gibi çalıştığından şüpheleniyorum ...


@toddk ... var olmayan bir özelliği hedeflediniz: @foo. @Prop ;-)
Metro Smurf

4

Bağlantının içeriğiyle de eşleşmeniz gerekiyorsa text () kullanın:

//a[contains(@href,"/some_link")][text()="Click here"]



1

Yukarıdaki kod için ... // * [içerir (@ prop, 'foo')]


Bu, foo girişi olan herhangi bir öğe içindir, ancak özellik "prop" olmalıdır
digiguru

1

bunu dene:

// bir [içerir (prop @ 'foo')]

belgedeki herhangi bir "a" etiketi için çalışmalıdır

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.