XPath – node()和text()之间的区别
我无法理解text()和node()之间的区别。 据我所知, text()将是苹果在这种情况下的标签<item>apple</item>之间的任何东西。 节点将是什么节点实际上,这将是项目
但后来我被分配了一些工作,要求我“select产品下所有项目的文本”,另一个问题是“select所有部门中的所有pipe理器节点”
输出如何看起来像text()而不是node()
XML的片段
<produce> <item>apple</item> <item>banana</item> <item>pepper</item> </produce> <department> <phone>123-456-7891</phone> <manager>John</manager> </department>
当然,有更多的部门和更多的pipe理者,但这只是一个代码片段。
任何帮助将不胜感激!
在XPath术语( 比较 )中, text()和node()是节点testing 。
节点testing对一组节点(精确地说是一个节点)进行操作,并返回那些具有某种types的节点。 当没有提到轴时,默认情况下假设child轴。
有各种节点testing :
-
node()匹配任何节点(它们都是最不特定的节点testing) -
text()仅匹配文本节点 -
comment()匹配注释节点 -
*匹配任何元素节点 -
foo匹配任何名为"foo"元素节点 -
processing-instruction()匹配PI节点(它们看起来像<?name value?>)。 - 注意:
*还可以匹配属性节点,但只能沿着attribute轴。@*是attribute::*的缩写。 属性不是child轴的一部分,这就是为什么普通的*不select它们。
这个XML文件:
<produce> <item>apple</item> <item>banana</item> <item>pepper</item> </produce>
代表以下DOM(简化):
根节点
元素节点(name =“produce”)
文本节点(值=“\ n”)
元素节点(name =“item”)
文本节点(值=“苹果”)
文本节点(值=“\ n”)
元素节点(name =“item”)
文本节点(值=“香蕉”)
文本节点(值=“\ n”)
元素节点(name =“item”)
文本节点(值=“胡椒”)
文本节点(值=“\ n”)
所以XPath:
-
/select根节点 - 如果它有名字
"produce"(这称为文档元素 ,它代表文档本身,文档元素和根节点通常是混淆的,但它们不是相同的东西),则select根节点的子元素。 -
/produce/node()select任何types的子节点/produce/(即所有7个孩子) -
/produce/text()select4(!)只有空白的文本节点 -
/produce/item[1]select名为"item"的第一个子元素 -
/produce/item[1]/text()select所有的子文本节点(这里只有一个 – “apple”)
等等。
所以,你的问题
- “select产品下所有项目的文本”
/produce/item/text()(select3个节点) - “select所有部门中的所有经理节点”
//department/manager(select1个节点)
笔记
- XPath中的默认轴是
child轴。 您可以通过在不同的轴名称前面添加轴来更改轴。 例如://item/ancestor::produce - 元素节点具有文本值。 当你评估一个元素节点时,它的文本内容将被返回。 在这个例子中,
/produce/item[1]/text()和string(/produce/item[1])将是相同的。 - 另请参见此答案 ,其中以graphics方式概述了XPathexpression式的各个部分。
select产品下所有项目的文本:
//produce/item/text()
select所有部门的所有经理节点:
//department/*