Extrahieren Sie den Wert des Attributknotens über XPath


269

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

Eine XML-Beispieldatei lautet:

<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 childElemente zurückgegeben, aber ich möchte den Wert des nameAttributs haben.

Für meine XML-Beispieldatei möchte ich Folgendes ausgeben:

Child_2
Child_4
Child_1
Child_3

Mögliches Duplikat des Getting-Attributs mit XPath
Tripleee

Antworten:


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

Ihr Original child[@name]bedeutet ein Element, childdas ein Attribut hat name. Du willst child/@name.


14
Ich stimme zu, die Frage war, wie man den Wert des Attributs
erhält

5
Was ist, wenn ich nur den Wert / die Beschreibung / die Daten extrahieren möchte, die zwischen den Tags vorhanden sind?
Dinu Duke

146

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

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

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


1
Mit war xqillaes notwendig anzurufen xs:string. Ich wundere mich warum.
krlmlr

1
@krlmlr Ist wahrscheinlich xsdas Namespace-Präfix für die XPath-Funktionen. Sie sind also nicht mit anderen verwechselt.
Acdcjunior

4
LOL. Dies ist die einzige Antwort, die die Frage tatsächlich beantwortet. +1
james.garriss

3
Dies wird nur den ersten Treffer in xmllint
crazyduck

1
Was ist, wenn ich eine Liste von Attributen habe und deren Werte benötige? string () scheint nur den ersten Wert zurückzugeben.
Damluar

8

Du solltest benutzen //Parent[@id='1']/Children/child/data(@name)

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


7

Wie oben beantwortet:

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

gibt nur das nameAttribut der 4 childKnoten aus, die zu dem Parentdurch sein Prädikat angegebenen gehören [@id=1]. Sie müssen dann das Prädikat ändern [@id=2], um die childKnoten für das nächste zu erhaltenParent .

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

//child/@name

Sie können das nameAttribut aller childKnoten 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"

5
//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.


1

@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

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

//*[local-name()='Parent'][@id='1']/*[local-name()='Children']/*[local-name()='child']/@name 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.