Öznitelik düğümünün değerini XPath aracılığıyla ayıklayın


269

Bir öznitelik düğümünün değerini XPath aracılığıyla nasıl ayıklayabilirim?

Örnek bir XML dosyası:

<parents name='Parents'>
  <Parent id='1' name='Parent_1'>
    <Children name='Children'>
      <child name='Child_2' id='2'>child2_Parent_1</child>
      <child name='Child_4' id='4'>child4_Parent_1</child>
      <child name='Child_1' id='3'>child1_Parent_1</child>
      <child name='Child_3' id='1'>child3_Parent_1</child>
    </Children>
  </Parent>
  <Parent id='2' name='Parent_2'>
    <Children name='Children'>
      <child name='Child_1' id='8'>child1_parent2</child>
      <child name='Child_2' id='7'>child2_parent2</child>
      <child name='Child_4' id='6'>child4_parent2</child>
      <child name='Child_3' id='5'>child3_parent2</child>
    </Children>
  </Parent>
</parents>

Şimdiye kadar bu XPath dizesi var:

//Parent[@id='1']/Children/child[@name]  

Yalnızca childöğeleri döndürür , ancak nameözniteliğin değerine sahip olmak istiyorum .

Örnek XML dosyam için, çıktının olmasını istediğim şudur:

Child_2
Child_4
Child_1
Child_3

Yanıtlar:


350
//Parent[@id='1']/Children/child/@name 

Orijinal child[@name]belgeniz child, niteliği olan bir öğe anlamına gelir name. Sen istiyorsun child/@name.


14
Katılıyorum, soru özelliğin değerini nasıl elde
edeceğiydi

5
Etiketler arasında sadece değer / açıklama / veri ayıklamak istiyorum ....
Dinu Duke

146

Yalnızca değeri (özellik adları olmadan) almak için şunu kullanın string():

string(//Parent[@id='1']/Children/child/@name)

Fn: string () fucntion olarak argüman değerini döndürecektir xs:string. Bağımsız değişkeninin bir öznitelik olması durumunda, özniteliğin değerini olarak döndürür xs:string.


1
İle xqillaçağırmak için gerekliydi xs:string. Nedenini merak ediyorum.
krlmlr

1
@krlmlr Muhtemelen xsXPath işlevleri için ad alanı önekidir. Yani başkaları ile karıştırılmazlar.
acdcjunior

4
LOL. Soruyu gerçekten cevaplayan tek cevap bu. +1
james.garriss

3
Bu sadece
xmllint'te

1
Öznitelik listem varsa ve değerlerine ihtiyacım olursa ne olur? string () yalnızca ilk değeri döndürüyor gibi görünüyor.
Damluar

8

Kullanmalısın //Parent[@id='1']/Children/child/data(@name)

Öznitelikler serileştirilemez, böylece xml görünümlü bir sonuçta döndüremezsiniz. Yapmanız gereken, data () işlevini kullanarak nitelikten veri elde etmektir.


8

Yukarıda yanıtlandığı gibi:

//Parent[@id='1']/Children/child/@name 

yalnızca yüklemiyle belirtilen name4 childdüğümün özniteliğini verir . Daha sonra bir sonraki için düğüm kümesini almak için yüklemi değiştirmeniz gerekir .Parent[@id=1][@id=2]childParent

Ancak, Parentdüğümü tamamen görmezden gelir ve kullanırsanız:

//child/@name

tek seferde nametüm childdüğümlerin özniteliğini seçebilirsiniz .

name="Child_2"
name="Child_4"
name="Child_1"
name="Child_3"
name="Child_1"
name="Child_2"
name="Child_4"
name="Child_3"

5
//Parent/Children[@  Attribute='value']/@Attribute

Bu, elemanın 2 niteliğe sahip olduğu durumlarda kullanılabilir ve bir özelliği diğerinin yardımıyla alabiliriz.


2

@ryenus, Sonuçta döngü yapmalısınız. Ben vbscript bunu nasıl yaparım;

Set xmlDoc = CreateObject("Msxml2.DOMDocument")
xmlDoc.setProperty "SelectionLanguage", "XPath"
xmlDoc.load("kids.xml")

'Remove the id=1 attribute on Parent to return all child names for all Parent nodes
For Each c In xmlDoc.selectNodes ("//Parent[@id='1']/Children/child/@name")
    Wscript.Echo c.text
Next

2

ad alanı olan tüm xml için local-name () kullanın

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
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.