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!
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 übereincomment()
entspricht comment node*
Entspricht einem beliebigen Element Knotenfoo
entspricht einem beliebigen Elementknoten mit dem Namen "foo"
processing-instruction()
stimmt mit PI-Knoten überein (sie sehen aus wie <?name value?>
).*
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
/produce/item/text()
(3 Knoten ausgewählt)//department/manager
(1 Knoten ausgewählt)Anmerkungen
child
Achse. Sie können die Achse ändern, indem Sie einen anderen Achsnamen voranstellen. Zum Beispiel: //item/ancestor::produce
/produce/item[1]/text()
und string(/produce/item[1])
identisch.Wählen Sie den Text aller Artikel unter Produkte:
//produce/item/text()
Wählen Sie alle Manager-Knoten in allen Abteilungen aus:
//department/*