XPath: metin düğümünü seçin


154

Aşağıdaki XML'e sahip olmak:

<node>Text1<subnode/>text2</node>

XPath aracılığıyla birinci veya ikinci metin düğümünü nasıl seçerim?

Bunun gibi bir şey:

/node/text()[2]

tabii ki çalışmıyor çünkü düğüm içindeki her metnin birleştirilmiş sonucudur.


11
Yazdınız: /node/text()[2][...] çalışmıyor çünkü düğüm içindeki her metnin birleştirilmiş sonucu Bu yanlış: kök öğenin ikinci metin düğümü çocuğunode anlamına geliyor . Dize değeri (soyundan metin düğüm birleştirme) olacaktırstring(/node)

Xpath sorgusunun çalışması gerektiğini mi söylüyorsunuz? Sanırım başka bir yerde başka bir sorunum var. ;) Teşekkürler!
çekirdek

Yanıtlar:


190

Aşağıdaki XML'e sahip olmak:

<node>Text1<subnode/>text2</node> 

XPath aracılığıyla birinci veya ikinci metin düğümünü nasıl seçerim?

Kullanım :

/node/text()

Bu, XML belgesinin en üst öğesinin ("düğüm" adlı) tüm metin düğümü alt öğelerini seçer.

/node/text()[1]

Bu, XML belgesinin en üst öğesinin ("düğüm" adlı) ilk metin düğümü alt öğesini seçer.

/node/text()[2]

Bu, XML belgesinin üst öğesinin ("düğüm" olarak adlandırılan) ikinci metin düğümü alt öğesini seçer.

/node/text()[someInteger]

Bu, XML belgesinin üst öğesinin ("düğüm" olarak adlandırılır) bazı Tamsayılı metin düğüm alt öğesini seçer. Aşağıdaki XPath ifadesine eşdeğerdir:

/node/text()[position() = someInteger]

1
Bu PHP'de çalışıyor mu? Yalnızca metin düğümleri, hatta bir dizi etiketin arasındakiler arasında döngü oluşturmaya çalışıyorum. Sorun, etiketlerden bağımsız olarak birden çok metin düğümünün içeriğini bir araya getirmektir. Kullanılması //*[text()]neyse. /html/text()çalışmıyor.
Aaron Gillion

2
@AaronGillion, Evet, AFAIK PHP'nin düzgün çalışan bir XPath 1.0 değerlendirmesi var. /html/text()Belgedeki tüm metin düğümlerini seçmediğini unutmayın - yalnızca üst htmlöğenin alt öğeleri (altları olmayan) metin düğümleri . Muhtemelen istiyorsun /html//text() . XPath ifadelerini oluşturmak için genellikle XPath hakkında biraz bilgi ve anlayış gerekir.
Dimitre Novatchev

Teşekkürler. Çift eğik çizgi numarasını biraz önce anladım!
Aaron Gillion

@AaronGillion, hoş geldiniz. Bu çevrimiçi eğitim kursunun 2. modülünde XPath 1.0 ve 2.0'ın temellerini öğrenebilirsiniz: pluralsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

xpath'iniz çalışmalıdır. xpath'inizi ve benimkini hem MarkLogic hem de Zorba Xquery / Xpath uygulamasında test ettim.

İkisi de çalışmalı.

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2
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.