XPath: Öğeleri değerlerine göre nasıl seçebilirim?


221

XPath'ı kullanmaya yeni başladım ve bu temel bir soru olabilir. Lütfen benimle birlikte olun ve sorunu çözmemde bana yardımcı olun. Ben böyle bir XML dosyası var:

<RootNode>
  <FirstChild>
    <Element attribute1="abc" attribute2="xyz">Data</Element>
  <FirstChild>
</RootNode>

Bir <Element>etiketin varlığını doğrulayabilirim :

// Eleman [@ attribute1 = "abc" ve @ attribute2 = "xyz"]

Şimdi de dize için etiketin değerini kontrol etmek istiyorum "Data". Bunu başarmak için kullanmam söylendi:

// Eleman [@ attribute1 = "abc" ve @ attribute2 = "xyz" ve Veri]

Daha sonra ifade kullandığımda aşağıdaki hatayı alıyorum:

Onaylama hatası mesajı: Eşleşen Düğüm Yok //Element[@attribute1="abc" and @attribute2="xyz" and Data]

Kullandığım XPath ifadesinin geçerli olup olmadığını lütfen bana bildiriniz. Değilse geçerli XPath ifadesi ne olacak?

Yanıtlar:


329

Aşağıdaki durum:

//Element[@attribute1="abc" and @attribute2="xyz" and Data]

Veri öğesi öğesi için değil, Öğe içindeki Veri öğesinin varlığını denetler.

Bunun yerine kullanabilirsiniz

//Element[@attribute1="abc" and @attribute2="xyz" and text()="Data"]

25
//Element[@attribute1="abc" and @attribute2="xyz" and .="Data"]

Bu yanıtı eklememin nedeni .ve ile olan ilişkisini açıklamak istiyorum text().

İlk şey, kullanırken []iki tür veri vardır:

  1. [number] düğümünden bir düğüm seçmek için
  2. [bool] bir düğüm kümesini düğüm kümesinden filtrelemek için

Bu durumda, değer işleve göre boole olarak değerlendirilir boolean()ve bir kural vardır:

Filtreler her zaman bir bağlama göre değerlendirilir.

Karşılaştırmak gerektiğinde text()veya .bir dize ile "Data", ilk kullandığı string()bir boolean bir sonuç alır, daha dize türü için bu dönüşümü işlevini.

Hakkında iki önemli kural vardır string():

  1. string()Fonksiyon, bazı durumlarda, beklenmeyen sonuçlar doğurabilir düğüm kümesinde birinci düğüm, dize değeri dönen bir dizgeye bir düğüm kümesi dönüştürür.

    text()bir düğüm kümesi döndüren göreceli yol, geçerli düğümün (bağlam düğümü) tüm metin düğümünü içerir ["Data"]. Tarafından değerlendirildiğinde string(["Data"]), düğüm kümesinin ilk düğümünü döndürür, böylece yalnızca düğüm kümesinde yalnızca bir metin düğümü olduğunda "Veri" alırsınız.

  2. string()İşlevin tüm alt metni birleştirmesini istiyorsanız, düğüm kümesi yerine tek bir düğümü iletmeniz gerekir.

    Örneğin, bir düğüm kümesi alırız ['a', 'b'], oraya üst düğüme geçebilirsiniz string(parent), bu geri döner 'ab've string(.)durumunuzda birleştirilmiş bir dize döndürür "Data".

Her iki yol da yalnızca bir metin düğümü olduğunda aynı sonucu alı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.