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