แยกค่าของโหนดแอตทริบิวต์ผ่าน XPath


269

ฉันจะแยกค่าของโหนดแอ็ตทริบิวต์ผ่าน XPath ได้อย่างไร

ไฟล์ XML ตัวอย่างคือ:

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

จนถึงตอนนี้ฉันมีสตริง XPath นี้:

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

มันคืนค่าchildองค์ประกอบเท่านั้นแต่ฉันต้องการให้มีค่าของnameคุณลักษณะ

สำหรับไฟล์ XML ตัวอย่างของฉันนี่คือสิ่งที่ฉันต้องการให้ผลลัพธ์:

Child_2
Child_4
Child_1
Child_3

มีความเป็นไปได้ที่ซ้ำกันของการรับแอตทริบิวต์โดยใช้ XPath
tripleee

คำตอบ:


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

เดิมของคุณchild[@name]หมายถึงองค์ประกอบที่มีแอตทริบิวต์child คุณต้องการnamechild/@name


14
ฉันเห็นด้วยคำถามคือวิธีการรับค่าของคุณลักษณะ
Vladtn

5
จะเกิดอะไรขึ้นถ้าฉันต้องการแยกเฉพาะค่า / คำอธิบาย / ข้อมูลที่อยู่ในแท็ก ....
Dinu Duke

146

ในการรับค่า (ไม่มีชื่อแอททริบิว) ให้ใช้string():

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

Fn: สตริง () fucntion xs:stringจะกลับค่าของการโต้แย้งในฐานะที่เป็น xs:stringในกรณีที่อาร์กิวเมนต์เป็นคุณลักษณะมันจึงจะกลับค่าแอตทริบิวต์เป็น


1
ด้วยมันเป็นสิ่งจำเป็นที่จะเรียกxqilla xs:stringฉันสงสัยว่าทำไม.
krlmlr

1
@krlmlr อาจxsเป็นคำนำหน้าเนมสเปซสำหรับฟังก์ชั่น XPath ดังนั้นพวกเขาจะไม่ปะปนกับคนอื่น
acdcjunior

4
ฮ่า ๆ. นี่เป็นคำตอบเดียวที่ตอบคำถามได้จริง +1
james.garriss

3
สิ่งนี้จะให้เฉพาะการเข้าชมครั้งแรกใน xmllint
crazyduck

1
ถ้าฉันมีรายการคุณลักษณะและฉันต้องการค่าของพวกเขา string () ดูเหมือนว่าจะส่งกลับเพียงค่าแรก
damluar

8

คุณควรใช้ //Parent[@id='1']/Children/child/data(@name)

แอ็ตทริบิวต์ไม่สามารถต่อเนื่องกันได้ดังนั้นคุณจะไม่สามารถส่งคืนได้ในผลลัพธ์การค้นหา xml สิ่งที่คุณต้องทำคือรับข้อมูลจากแอ็ตทริบิวต์โดยใช้ data () ฟังก์ชัน


8

ตามคำตอบข้างต้น:

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

จะแสดงผลเฉพาะแอnameททริบิวต์ของ 4 childโหนดที่เป็นของที่Parentระบุโดยเพ[@id=1]รดิเคต จากนั้นคุณจะต้องเปลี่ยนคำกริยาในการ[@id=2]ที่จะได้รับชุดของโหนดสำหรับถัดไปchildParent

อย่างไรก็ตามหากคุณไม่สนใจParentโหนดทั้งหมดและใช้:

//child/@name

คุณสามารถเลือกnameคุณสมบัติของchildโหนดทั้งหมดได้ในครั้งเดียว

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

นี่เป็นกรณีที่สามารถใช้งานได้โดยที่อิลิเมนต์นั้นมี 2 คุณลักษณะและเราสามารถรับแอตทริบิวต์หนึ่งได้ด้วยความช่วยเหลือของอีกคุณสมบัติหนึ่ง


2

@ryenus คุณต้องวนซ้ำผลลัพธ์ นี่คือวิธีที่ฉันจะทำมันใน vbscript;

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.