XPath-разница между узлом () и текстом()



у меня возникли проблемы с пониманием разницы между text() и node(). Насколько я понимаю, text() будет все, что находится между тегами <item>apple</item> что это apple в этом случае. Узел будет тем, что на самом деле является этим узлом, который будет item



но тогда мне была назначена некоторая работа, в которой он просит меня "выбрать текст всех элементов под продуктом" , и отдельный вопрос задает "выбрать все узлы менеджера во всех отделы"



как выходной, предполагают, чтобы выглядеть text() в противоположность node()



фрагмент XML:



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

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


конечно, есть больше отделов и больше менеджеров, но это был просто фрагмент кода.



любая помощь будет высоко ценится!

668   2  

2 ответов:

text() и node() are тесты узле, в терминологии XPath (сравнить).

тесты узлов работают на множестве (на ось, если быть точным) узлов и возвращать те, которые имеют определенный тип. Если ось не упоминается, то child ось принимается по умолчанию.

есть все виды тесты узле:

  • node() игр любой узел (наименее конкретный тест узла из них всех)
  • text() игр текст узлы только
  • comment() игр комментарий узлы
  • * соответствует элемент узел
  • foo соответствует любому узлу элемента с именем "foo"
  • processing-instruction() соответствует узлам PI (они выглядят как <?name value?>).
  • Примечание: The * также соответствует узлам атрибутов, но только вдоль attribute оси. @* это сокращение от attribute::*. Атрибуты не являются частью child ось, вот почему нормальный * не выбирает их.

этот XML-документ:

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

представляет собой следующий DOM (упрощенный):

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")

так и с XPath:

  • / выбирает корневой узел
  • /produce выбирает дочерний элемент корневого узла, если он имеет имя "produce" (это называется элемент документа; он представляет собой сам документ. Элемент документа и корневой узел часто путают, но это не одно и то же.)
  • /produce/node() выбирает любой тип дочернего узла под /produce/ (т. е. все 7 детей)
  • /produce/text() выбор 4 (!) пробелы-только текстовые узлы
  • /produce/item[1] выбирает первый дочерний элемент с именем "item"
  • /produce/item[1]/text() выбирает все дочерние текстовые узлы (в данном случае только один - "Яблоко")

и так далее.

так,

  • "выберите текст всех элементов в разделе Продукция"/produce/item/text() (3 выбранных узлов)
  • "выберите все узлы менеджера во всех отделах"//department/manager (выбран 1 узел)

Примечания

  • по умолчанию ось в XPath это child ось. Вы можете изменить ось, добавив префикс к другому имени оси. Например: //item/ancestor::produce
  • узлы элементов имеют текстовые значения. При вычислении узла элемента будет возвращено его текстовое содержимое. В случае этого примера, /produce/item[1]/text() и string(/produce/item[1]) будет то же самое.
  • см. Также ответ где я выделяю отдельные части выражения XPath графически.

выберите текст всех элементов в разделе Продукция:

//produce/item/text()

выберите все узлы менеджера во всех отделах:

//department/*

Comments

    Ничего не найдено.