2010-07-28 28 views
32

Merhaba Bu şekilde yapılandırılmış bir XML dosyanız var:Bir dizi düğüm seçmek için xpath nedir?

 <foo> 
    <bar></bar> 
    <bar></bar> 
    ... 
</foo> 

Bir dizi düğümün nasıl yakalanacağını bilmiyorum. Birisi bana çubuk düğümleri 100-200 kapmak bir xpath ifadesi bir örnek verebilir.

+0

İyi soru (1). Tam olarak gerekli düğümleri seçerek kısa bir XPath ifadesi için cevabımı görün. –

cevap

53

Kullanım:

/*/bar[position() >= 100 and not(position() > 200)] 

not Do: 200 (dahil) kadar 100 konumunda

  1. Tam bar elemanları seçilir.

  2. Bu XPath ifadelerinin değerlendirilmesi, // kısaltması kullanılarak bir ifadeden çok daha hızlı olabilir; çünkü bu, kökü, bağlamsal düğüm olan kökü tam bir taramaya neden olur. daima bu mümkün olduğunda durumlarda // kısaltması kullanarak kaçınmaya çalışın.

+0

Hatırlarsan, ikinci noktanıza gidebilir misin? Will // ve/*/aynı sonuçları döndürecek ve yine de ikincisi daha hızlı mı? –

+0

@BramVanroy, Her ikisi de '//' ve '/ * /' sözdizimsel olarak geçersiz XPath ifadeleridir. // // 've/*/* anlamına geldiğini tahmin ediyorum. Cevap, bu özel durumda, alınan zamanın yaklaşık olarak aynı olması gerektiğidir. tam ekspresyonu, tarama durumunda kaçınırken - temel fonksiyonlar dahil Bununla birlikte, eğer, aşağıdakileri içeren ekspresyon '//' bir bütün ağaç (son olarak seçilen düğüm daha soyundan) tarama ve her bir düğüm filtre gerekir. Ayrıca, // * 've benzeri ifadeleri verimli bir şekilde işlemek için son derece optimize edilmiş bazı ** XPath işlemcilerin de olduğunu unutmayın. –

8
//foo/bar[100 <= position() and position() < 200] 
4

fn:subsequence iyi yolu değil midir? 200 ile

subsequence(/foo/bar, 100, 101) 

döner pozisyon 100 tüm öğeler, bu 101 ürün (ya da kaynak dizisi kısa ise daha az).

+0

Bu doğru olsa da, bir yüklemde position() kullanımı daha geneldir, çünkü birden çok düzeyde uygulanabilir. Örnek:/deneme/bar [2 <= konumu() ve konum() <5]/x [5 <= konumu() ve konum() <10] @DonaldRich Evet –

+0

- edilene 'pozisyonu() 'yol açar, ancak sekanstaki her bir maddede değerlendirilmelidir (bu son olarak seçilen 100 öğeden çok daha fazlası olabilir), “alt()” ise sadece bir kez çağrılır. Neyse, bu konuşma 'nasıl 200 aracılığıyla pozisyonlarda 100 dizideki tüm düğümleri seçebilir' ilgilidir ve ** değil ** 'biz gereksinimi filtreleme mümkün olan her sekans için '' pozisyon() kullanarak kaçınabilir?' Hakkında Cevabım, doğrudan - ve sadece - sorulan soruyla ilgilidir. Btw, 'alt-dizisinin _have_ Resim @DonaldRich – CiaPan

+0

() 'mevcuttur, sorgu kolayca altdizi' olarak yeniden olabilir (dizisini (/ deneme/çubuk, 2, 3)/x, 5, 5) ' – CiaPan

İlgili konular