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>
конечно, есть больше отделов и больше менеджеров, но это был просто фрагмент кода.
любая помощь будет высоко ценится!
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