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