XPath-różnica między node () a tekstem()

Mam problem ze zrozumieniem różnicy między text() A node(). Z tego, co rozumiem, text() byłoby tym, co znajduje się pomiędzy znacznikami <item>apple</item>, czyli apple w tym przypadku. Node będzie tym, czym ten węzeł faktycznie jest, czyli item

Ale potem przypisano mi pracę, w której prosi mnie o "zaznaczenie tekstu wszystkich elementów w produce" i osobne pytanie pyta "Wybierz wszystkie węzły menedżera we wszystkich działach"

Jak jest wyjście przypuśćmy, że wygląd text() w przeciwieństwie do node()

Fragment XML:

<produce>
 <item>apple</item>
 <item>banana</item>
 <item>pepper</item>
</produce>

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

Oczywiście, jest więcej działów i więcej menedżerów, ale to był tylko fragment kodu.

Każda pomoc będzie mile widziana!
Author: Luke Girvin, 2012-07-31

2 answers

text() i node() testami węzłów , w terminologii XPath (porównaj ).

Testy węzłów działają na zbiorze (na , aby być dokładnym) węzłów i zwracają te, które są określonego typu. Jeśli żadna oś nie jest wymieniona, domyślnie przyjmuje się Oś child.

Istnieją wszelkiego rodzaju testy węzłów :

  • node() dopasowuje dowolny węzeł (najmniej szczegółowy test węzła z nich wszystkich)
  • text() Mecze tekst tylko węzły
  • comment() mecze skomentuj węzły
  • * dopasowuje dowolny element węzeł
  • foo pasuje do dowolnego węzła o nazwie "foo"
  • processing-instruction() dopasowuje węzły PI (wyglądają jak <?name value?>).
  • Uwaga: * również dopasowuje węzły atrybutów, ale tylko wzdłuż osi attribute. @* jest skrótem od attribute::*. Atrybuty nie są częścią osi child, dlatego normalna * nie wybiera oni.

Ten dokument XML:

<produce>
    <item>apple</item>
    <item>banana</item>
    <item>pepper</item>
</produce>

Reprezentuje następujący DOM (uproszczony):

root node
   element node (name="produce")
      text node (value="\n    ")
      element node (name="item")
         text node (value="apple")
      text node (value="\n    ")
      element node (name="item")
         text node (value="banana")
      text node (value="\n    ")
      element node (name="item")
         text node (value="pepper")
      text node (value="\n")

Więc z XPath:

  • / wybiera węzeł korzeniowy
  • /produce wybiera element potomny węzła głównego, jeśli ma nazwę "produce" (nazywa się to elementem dokumentu ; reprezentuje on sam dokument. Element dokumentu i węzeł główny są często mylone, ale to nie to samo.)
  • /produce/node() wybiera dowolny typ węzeł dziecięcy poniżej /produce/ (czyli wszystkie 7 dzieci)
  • /produce/text() wybiera 4 (!) whitespace-only text nodes
  • /produce/item[1] wybiera pierwszy element potomny o nazwie "item"
  • /produce/item[1]/text() wybiera wszystkie potomne węzły tekstowe (w tym przypadku jest tylko jeden - "apple")

I tak dalej.

Twoje pytania]}
  • "zaznacz tekst wszystkich elementów w polu produce" /produce/item/text() (3 węzły wybrane)
  • " wybierz cały menedżer węzły we wszystkich działach" //department/manager (1 node selected)

Uwagi

  • domyślną osią W XPath jest oś child. Oś można zmienić poprzez prefiks innej nazwy osi. Na przykład: //item/ancestor::produce
  • węzły elementów mają wartości tekstowe. Podczas oceny węzła elementu zwracana jest jego zawartość tekstowa. W tym przykładzie /produce/item[1]/text() i string(/produce/item[1]) będą takie same.
  • Zobacz też tę odpowiedź gdzie przedstawiam indywidualną części wyrażenia XPath graficznie.
 113
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:28

Wybierz tekst wszystkich elementów w polu produce:

//produce/item/text()

Wybierz wszystkie węzły menedżera we wszystkich działach:

//department/*
 1
Author: Danil Speransky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-22 18:54:43