wake-up-neo.com

Wert des Attributknotens über XPath extrahieren

Wie kann ich den Wert eines Attributknotens über XPath extrahieren?

Eine XML-Beispieldatei ist:

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

Bisher habe ich diese XPath-Zeichenfolge:

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

Es werden nur child Elemente zurückgegeben, aber ich hätte gerne den Wert des name Attributs.

Für meine XML-Beispieldatei sollte die Ausgabe wie folgt aussehen:

Child_2
Child_4
Child_1
Child_3
241
Rehman
//Parent[@id='1']/Children/child/@name 

Ihr ursprünglicher child[@name] bedeutet ein Element child, das ein Attribut name hat. Du willst child/@name.

314
lweller

Verwenden Sie string(), um nur den Wert (ohne Attributnamen) abzurufen:

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

Die fn: string () -Funktion gibt den Wert ihres Arguments als xs:string zurück. Wenn es sich bei dem Argument um ein Attribut handelt, wird der Wert des Attributs als xs:string zurückgegeben.

130
acdcjunior

Wie oben beantwortet:

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

gibt nur das name Attribut der 4 child Knoten aus, die zu dem Parent gehören, der durch sein Prädikat [@id=1] spezifiziert ist. Sie müssen dann das Prädikat in [@id=2] ändern, um die Gruppe von child Knoten für das nächste Parent zu erhalten.

Wenn Sie jedoch den Knoten Parent vollständig ignorieren und Folgendes verwenden:

//child/@name

sie können das name Attribut aller child Knoten auf einmal auswählen.

name="Child_2"
name="Child_4"
name="Child_1"
name="Child_3"
name="Child_1"
name="Child_2"
name="Child_4"
name="Child_3"
6
Vinod Srivastav
//Parent/Children[@  Attribute='value']/@Attribute

Dies ist der Fall, der verwendet werden kann, wenn das Element 2 Attribute hat und wir das eine Attribut mit Hilfe eines anderen erhalten können.

5
Akshay Dubey

Sie sollten //Parent[@id='1']/Children/child/data(@name) verwenden

Die Attribute können nicht serialisiert werden, sodass Sie sie nicht in einem XML-Ergebnis zurückgeben können. Sie müssen lediglich die Daten mit der Funktion data () aus dem Attribut abrufen.

5

@ryenus, Sie müssen das Ergebnis durchlaufen. So würde ich es in VBScript machen;

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

verwenden Sie für alle XML-Dateien mit Namespace local-name ().

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
0
metal