66

我很难理解 和 之间的text()区别node()。据我了解,在这种情况下text(),标签之间的<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>

当然,还有更多的部门和更多的管理者,但这只是一小段代码。

任何帮助将非常感激!

4

2 回答 2

132

text()并且node()节点测试,在 XPath 术语中(比较)。

节点测试在一组(确切地说是在轴上)节点上运行,并返回特定类型的节点。当没有提及child轴时,默认假定轴。

有各种各样的节点测试

  • node()匹配任何节点(所有节点中最不具体的节点测试)
  • text()仅匹配文本节点
  • comment()匹配评论节点
  • *匹配任何元素节点
  • foo匹配任何命名的元素节点"foo"
  • processing-instruction()匹配 PI 节点(它们看起来像<?name value?>)。
  • 旁注:*匹配属性节点,但仅沿attribute轴匹配。@*是 的简写attribute::*。属性不是child轴的一部分,这就是法线*不选择它们的原因。

此 XML 文档:

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

表示以下 DOM(简化):

根节点
   元素节点(名称=“生产”)
      文本节点(值=“\n”)
      元素节点(名称=“项目”)
         文本节点(值=“苹果”)
      文本节点(值=“\n”)
      元素节点(名称=“项目”)
         文本节点(值=“香蕉”)
      文本节点(值=“\n”)
      元素节点(名称=“项目”)
         文本节点 (value="pepper")
      文本节点(值="\n")

所以使用 XPath:

  • /选择根节点
  • /produce如果有名称,则选择根节点的子元素"produce"(这称为文档元素;它代表文档本身。文档元素和根节点经常混淆,但它们不是同一个东西。)
  • /produce/node()选择下面的任何类型的子节点/produce/(即所有 7 个子节点)
  • /produce/text()选择 4 个 (!) 纯空格文本节点
  • /produce/item[1]选择第一个名为的子元素"item"
  • /produce/item[1]/text()选择所有子文本节点(只有一个 - “apple” - 在这种情况下)

等等。

所以,你的问题

  • “选择生产下所有项目的文本” /produce/item/text()(选择了3个节点)
  • “选择所有部门中的所有经理节点” //department/manager(选择了1个节点)

笔记

  • XPath 中的默认child轴。您可以通过为不同的轴名称添加前缀来更改轴。例如://item/ancestor::produce
  • 元素节点具有文​​本值。当您评估元素节点时,将返回其文本内容。在此示例中,/produce/item[1]/text()string(/produce/item[1])将是相同的。
  • 另请参阅此答案,其中我以图形方式概述了 XPath 表达式的各个部分。
于 2012-07-31T16:27:16.247 回答
0

对我来说,当我面对这种情况时,这是一个很大的不同(这里是我的故事:)

<?xml version="1.0" encoding="UTF-8"?>
<sentence id="S1.6">When U937 cells were infected with HIV-1, 
        
    <xcope id="X1.6.3">
        <cue ref="X1.6.3" type="negation">no</cue> 
                        
                        induction of NF-KB factor was detected
        
    </xcope>
                    
, whereas high level of progeny virions was produced, 
        
    <xcope id="X1.6.2">
        <cue ref="X1.6.2" type="speculation">suggesting</cue> that this factor was 
        <xcope id="X1.6.1">
            <cue ref="X1.6.1" type="negation">not</cue> required for viral replication
        </xcope>
    </xcope>.

</sentence>

我需要提取标签之间的文本并聚合(通过连接)包括内部标签中的文本。

/node()/text()了一半的工作

/text()只返回不包含在内部标签中的文本,因为内部标签不是“文本节点”。您可能会想,“只提取包含在附加 xpath 中的内部标签中的文本”,但是,按原始顺序对文本进行排序变得具有挑战性,因为您不知道将内部标签中的聚合文本放置在哪里!因为您不知道知道在哪里放置来自内部节点的聚合文本。

  1. 当 U937 细胞被 HIV-1 感染时,
  2. 未检测到 NF-KB 因子的诱导
  3. ,而产生了高水平的后代病毒体,
  4. 表明该因素不是病毒复制所必需的
  5. .

最后,/node()正是我想要的,因为它也从内部标签中获取文本。

于 2020-08-11T07:38:53.937 回答