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/*