Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath 谓词:表达式nodeName=';文本';评价的?_Xpath - Fatal编程技术网

Xpath 谓词:表达式nodeName=';文本';评价的?

Xpath 谓词:表达式nodeName=';文本';评价的?,xpath,Xpath,在此xpath中: /A/B[C='hello'] C=“hello”是C[text()=“hello”]的某种语法快捷方式吗?它在任何地方都有记录吗 编辑:好的,我发现了一个区别:C=返回C和C的子节点中的所有文本节点,而C[text()=只返回C中的文本节点 现在,假设我有XML: <root> <A> <B> <C>hello<E>EEE</E>world</C> &

在此xpath中:

/A/B[C='hello']
C=“hello”
C[text()=“hello”]
的某种语法快捷方式吗?它在任何地方都有记录吗

编辑:好的,我发现了一个区别:
C=
返回C和C的子节点中的所有文本节点,而
C[text()=
只返回C中的文本节点

现在,假设我有XML:

<root>

  <A>
    <B>
      <C>hello<E>EEE</E>world</C>
      <D>world</D>
    </B>

    <B>
      <C>goodbye</C>
      <D>mars</D>
    </B>
  </A>

</root>
但这不起作用:

/root/A/B[C[text()="helloworld"]]
这些也不是:

/root/A/B[C[text()="hello world"]]
/root/A/B[C[text()="helloEEEworld"]]
嗯……这是有效的:

/root/A/B[C[text()="hello"]]

为什么会这样?是否
text()
只返回第一个文本节点?根据W3C,
text()
返回上下文节点的所有文本节点子节点。

C
在谓词表达式
[C='hello']
返回所有
C
元素,这些元素是上下文元素
B
的直接子元素。因此,整个谓词是一个布尔表达式,其中包含节点集和字符串之间的比较(请注意,元素是中的节点类型),规范中记录了这种情况的行为,如下所示:

如果要比较的一个对象是节点集,而另一个是字符串,则当且仅当节点集中有一个节点,且对该节点的字符串值和另一个字符串执行比较的结果为真时,比较才会为真。如果要比较的一个对象是节点集,另一个是布尔值,则comp当且仅当对布尔值和使用布尔函数将节点集转换为布尔值的结果执行比较的结果为真时,arison才为真。[]

/A/B[C='hello']
中的
C='hello'
如果任何
C
元素在转换为字符串后等于“hello”,则将被计算为
true
。因此,如果您愿意,它更像是
C[string()='hello']
的快捷方式

“嗯……这是有效的:

/root/A/B[C[text()="hello"]]
/root/A/B[C[text()=“hello”]

为什么?text()只返回第一个文本节点吗?根据W3C,text()返回上下文节点的所有文本节点子节点。“

此上下文中的
text()
不是第一个文本节点,而是返回所有直接子文本节点。这是因为
child::
是XPath中的默认轴。将您的XPath与它的等效详细版本进行对比:

/child::root/child::A/child::B[child::C[child::text()="hello"]]
text()

当您使用
/root/A/B[C[text()=“hello”]
时,您的意思是将
B
节点与
C
子节点一起提取任何直接子节点都等于
“hello”

同样,您也可以通过以下方式进行匹配:

/root/A/B[C[text()="world"]]
或者明确指定要通过精确的第一个或第二个直接子文本节点获取节点

/root/A/B[C[text()[1]="hello"]]
/root/A/B[C[text()[2]="world"]]
如果希望通过所需节点的完整文本内容匹配该节点,则可以使用

/root/A/B[C[.="helloEEEworld"]]


可能对您的响应也很有用。1)好的,
C=
语法需要xpath
/root/A/B[C=“helloeeworld”]
来查找匹配项。显然,C节点的字符串值是其边界内的所有文本连接在一起。2)xpath
/root/A/B[C[text()=“helloworld”]
匹配任何内容吗?据我所知,C的两个直接子文本节点是
“hello”
“world”
.Ah,好的。在1)中,节点集中唯一的节点是C。在2)中,节点集中有两个节点,即两个文本节点……。规则是将节点集中的每个节点转换为字符串,然后将结果与转换节点集中唯一的节点时,
=
符号右侧的结果进行比较(即C节点)转换为字符串,得到的是
“helloeeworld”
。在2)中,当您转换节点集中的第一个节点,即“hello”文本节点时,得到的是“hello”,它与
=
符号右侧的内容相比较,然后节点集中的第二个节点,即“world”文本节点,转换为字符串“world”,然后将“世界”与
=
符号右侧的内容进行比较。
/root/A/B[C="helloEEEworld"]