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!2 answers
text()
i node()
są testami węzłów , w terminologii XPath (porównaj ).
Testy węzłów działają na zbiorze (na oś, 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ż osiattribute
.@*
jest skrótem odattribute::*
. Atrybuty nie są częścią osichild
, 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()
istring(/produce/item[1])
będą takie same. - Zobacz też tę odpowiedź gdzie przedstawiam indywidualną części wyrażenia XPath graficznie.
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/*
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