Xml XPath-节点()和文本()之间的差异

Xml XPath-节点()和文本()之间的差异,xml,xpath,expression,Xml,Xpath,Expression,我很难理解text()和node()之间的区别。据我所知,text()将是标签apple之间的任何内容,在本例中是apple。节点将是该节点实际是什么,即项 但后来我被分配了一些工作,其中要求我“选择生产项下所有项目的文本”,另一个问题是“选择所有部门中的所有经理节点” 相对于node() XML片段: <produce> <item>apple</item> <item>banana</item> <item>pep

我很难理解
text()
node()
之间的区别。据我所知,
text()
将是标签
apple
之间的任何内容,在本例中是apple。节点将是该节点实际是什么,即

但后来我被分配了一些工作,其中要求我“选择生产项下所有项目的文本”,另一个问题是“选择所有部门中的所有经理节点”

相对于
node()

XML片段:

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

<department>
 <phone>123-456-7891</phone>
 <manager>John</manager>
</department>

苹果
香蕉
胡椒粉
123-456-7891
约翰
当然,有更多的部门和更多的经理,但这只是一段代码


任何帮助都将不胜感激

选择“生产”下所有项目的文本:

//produce/item/text()
选择所有部门中的所有经理节点:

//department/*
text()
node()
是XPath术语中的节点测试()

节点测试对一组(确切地说是一组)节点进行操作,并返回特定类型的节点。当未提及轴时,默认情况下采用子轴

有各种各样的:

  • node()
    匹配任何节点(所有节点中最不特定的节点测试)
  • text()
    仅匹配文本节点
  • comment()
    匹配注释节点
  • *
    匹配任何元素节点
  • foo
    匹配名为
    的任何元素节点“foo”
  • processing-instruction()
    匹配PI节点(它们看起来像
  • 旁注:
    *
    也匹配属性节点,但仅沿
    属性轴匹配
    @*
    属性::*
    的缩写。属性不是
    子轴的一部分,这就是为什么正常的
    *
    不会选择它们
此XML文档:

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

苹果
香蕉
胡椒粉
表示以下DOM(简化):

根节点 元素节点(name=“product”) 文本节点(值=“\n”) 元素节点(name=“item”) 文本节点(value=“apple”) 文本节点(值=“\n”) 元素节点(name=“item”) 文本节点(value=“banana”) 文本节点(值=“\n”) 元素节点(name=“item”) 文本节点(value=“pepper”) 文本节点(值=“\n”) 对于XPath:

  • /
    选择根节点
  • /product
    选择根节点的子元素,如果它的名称为
    “product”
    (这称为文档元素;它表示文档本身。文档元素和根节点经常混淆,但它们不是一回事。)
  • /product/node()
    选择
    /product/
    下的任何类型的子节点(即所有7个子节点)
  • /product/text()
    选择4个仅限空白的文本节点
  • /product/item[1]
    选择名为
    的第一个子元素“item”
  • /product/item[1]/text()
    选择所有子文本节点(在本例中只有一个“苹果”)
等等

那么,你的问题是什么

  • “选择Product下所有项目的文本”
    /product/item/text()
    (已选择3个节点)
  • “选择所有部门中的所有经理节点”
    //部门/经理
    (选择1个节点)
注释

  • XPath中的默认轴是
    子轴
    轴。可以通过在轴名称前加前缀来更改轴。例如:
    //项目/祖先::生产
  • 元素节点具有文本值。计算元素节点时,将返回其文本内容。在本例中,
    /product/item[1]/text()
    字符串(/product/item[1])
    将是相同的
  • 另请参见我在其中以图形方式概述XPath表达式的各个部分

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


当U937细胞被HIV-1感染时,
不
检测NF-KB因子的诱导
,而产生了高水平的子代病毒粒子,
表明这个因素是
病毒复制不需要
.
我需要在标记之间提取文本,并聚合(通过concat)包含在innner标记中的文本

/node()
完成了任务,而
/text()
完成了一半任务

/text()
仅返回未包含在内部标记中的文本,因为内部标记不是“文本节点”。您可能会想,“只需在额外的xpath中提取包含在内部标记中的文本”,但是,按照原始顺序对文本进行排序变得非常困难,因为您不知道从内部标记将聚合文本放置在何处!因为您不知道将来自内部节点的聚合文本放置在何处

  • 当U937细胞被HIV-1感染时
  • 未检测到NF-KB因子的诱导
  • ,而产生了高水平的子代病毒粒子
  • 表明病毒复制不需要这个因子

  • 最后,
    /node()
    完全满足了我的要求,因为它也从内部标记获取文本。

    这是一个很好的答案,但在记录中,有一些不准确之处。(a) 节点测试的含义取决于轴:对于大多数轴,它选择元素节点,但是对于属性轴,它选择属性,对于名称空间轴,它选择名称空间。(b)
    @*
    @foo
    不是节点测试,而是轴步骤,由两部分组成:轴(
    @
    ),即 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")
    <?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>