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”
匹配PI节点(它们看起来像processing-instruction()
)- 旁注:
也匹配属性节点,但仅沿*
属性轴匹配
是@*
的缩写。属性不是属性::*
子轴的一部分,这就是为什么正常的
不会选择它们*
<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()
下的任何类型的子节点(即所有7个子节点)/product/
选择4个仅限空白的文本节点/product/text()
选择名为/product/item[1]
的第一个子元素“item”
选择所有子文本节点(在本例中只有一个“苹果”)/product/item[1]/text()
- “选择Product下所有项目的文本”
(已选择3个节点)/product/item/text()
- “选择所有部门中的所有经理节点”
(选择1个节点)//部门/经理
- XPath中的默认轴是
轴。可以通过在轴名称前加前缀来更改轴。例如:子轴
//项目/祖先::生产
- 元素节点具有文本值。计算元素节点时,将返回其文本内容。在本例中,
和/product/item[1]/text()
将是相同的字符串(/product/item[1])
- 另请参见我在其中以图形方式概述XPath表达式的各个部分
当U937细胞被HIV-1感染时,
不
检测NF-KB因子的诱导
,而产生了高水平的子代病毒粒子,
表明这个因素是
病毒复制不需要
.
我需要在标记之间提取文本,并聚合(通过concat)包含在innner标记中的文本
/node()
完成了任务,而/text()
完成了一半任务
/text()
仅返回未包含在内部标记中的文本,因为内部标记不是“文本节点”。您可能会想,“只需在额外的xpath中提取包含在内部标记中的文本”,但是,按照原始顺序对文本进行排序变得非常困难,因为您不知道从内部标记将聚合文本放置在何处!因为您不知道将来自内部节点的聚合文本放置在何处
最后,
/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>