wake-up-neo.com

XPath - Unterschied zwischen node () und text ()

Ich habe Probleme, den Unterschied zwischen text() und node() zu verstehen. Soweit ich weiß, würde text() das sein, was sich zwischen den Tags <item>Apple</item> Befindet, was in diesem Fall Apple ist. Node wäre was auch immer dieser Node ist, das wäre item

Aber dann wurde mir eine Arbeit zugewiesen, in der ich gefragt werde, ob ich den Text aller zu produzierenden Artikel auswählen soll. In einer separaten Frage wird gefragt, ob alle Manager-Knoten in allen Abteilungen ausgewählt werden sollen.

Wie soll die Ausgabe aussehen? text() im Gegensatz zu node()

XML-Snippet:

<produce>
 <item>Apple</item>
 <item>banana</item>
 <item>pepper</item>
</produce>

<department>
 <phone>123-456-7891</phone>
 <manager>John</manager>
</department>

Natürlich gibt es mehr Abteilungen und mehr Manager, aber das war nur ein Ausschnitt aus dem Code.

Jede Hilfe wäre sehr dankbar!

57
Pztar

text() und node() sind in der XPath-Terminologie Knotentests ( vergleiche ).

Knotentests werden an einer Menge (um genau zu sein an einer Achse ) von Knoten ausgeführt und geben diejenigen zurück, die von einem bestimmten Typ sind. Wenn keine Achse angegeben ist, wird standardmäßig die Achse child verwendet.

Es gibt alle Arten von Knotentests :

  • node() entspricht any node (der am wenigsten spezifische Knotentest von allen)
  • text() stimmt nur mit text Knoten überein
  • comment() entspricht comment node
  • * Entspricht einem beliebigen Element Knoten
  • foo entspricht einem beliebigen Elementknoten mit dem Namen "foo"
  • processing-instruction() stimmt mit PI-Knoten überein (sie sehen aus wie <?name value?>).
  • Randnotiz: Der * Stimmt auch mit Attributknoten überein, jedoch nur entlang der attribute Achse. @* Ist eine Abkürzung für attribute::*. Attribute sind nicht Teil der child Achse, deshalb werden sie von einem normalen * Nicht ausgewählt.

Dieses XML-Dokument:

<produce>
    <item>Apple</item>
    <item>banana</item>
    <item>pepper</item>
</produce>

repräsentiert das folgende DOM (vereinfacht):

 Wurzelknoten 
 Elementknoten (Name = "Erzeugnis") 
 Textknoten (Wert = "\ n") 
 Elementknoten (Name = "Gegenstand") 
 Textknoten (Wert = "Apple") 
 Textknoten (Wert = "\ n") 
 Elementknoten (Name = "Element") 
 Textknoten (value = "banana") 
 Textknoten (value = "\ n") 
 Elementknoten (name = "item") 
 Textknoten (value = "pepper") 
 Textknoten (Wert = "\ n") 

Also mit XPath:

  • / Wählt den Wurzelknoten aus
  • /produce Wählt ein untergeordnetes Element des Stammknotens aus, wenn es den Namen "produce" Hat (Dies wird Dokumentelement; es repräsentiert das Dokument selbst. Dokumentelement und Wurzelknoten werden oft verwechselt, sind aber nicht dasselbe.)
  • /produce/node() wählt jede Art von Kinderknoten unter /produce/ (d. h. alle 7 Kinder)
  • /produce/text() wählt die 4 (!) Nur-Leerzeichen-Textknoten aus
  • /produce/item[1] Wählt das erste untergeordnete Element mit dem Namen "item" Aus.
  • /produce/item[1]/text() wählt all untergeordnete Textknoten aus (in diesem Fall gibt es nur einen - "Apple")

Und so weiter.

Also deine Fragen

  • "Wählen Sie den Text aller Produkte aus"/produce/item/text() (3 Knoten ausgewählt)
  • "Alle Manager-Knoten in allen Abteilungen auswählen"//department/manager (1 Knoten ausgewählt)

Anmerkungen

  • Die Standardeinstellung Achse in XPath ist die child Achse. Sie können die Achse ändern, indem Sie einen anderen Achsnamen voranstellen. Zum Beispiel: //item/ancestor::produce
  • Elementknoten haben Textwerte. Wenn Sie einen Elementknoten auswerten, wird sein Textinhalt zurückgegeben. In diesem Beispiel sind /produce/item[1]/text() und string(/produce/item[1]) identisch.
  • Siehe auch diese Antwort wo ich die einzelnen Teile eines XPath-Ausdrucks grafisch umreiße.
121
Tomalak

Wählen Sie den Text aller Artikel unter Produkte:

//produce/item/text()

Wählen Sie alle Manager-Knoten in allen Abteilungen aus:

//department/*
1
Danil Speransky