我要做一些练习但是 我真的不明白两个相似路径之间的区别
我有树:
<b>
<t></t>
<a>
<n></n>
<p></p>
<p></p>
</a>
<a>
<n></n>
<p></p>
</a>
<a></a>
</b>
我们希望每个最终标记包含一个文本节点。
我要解释// a // text()和// a / text()
之间的区别我看到// a // text()返回所有文本节点,看起来合法, 但为什么// a / text()返回最后一个“节点” - &gt;文本节点?
另一个问题: 为什么// p [1]返回每个“节点”,第一个“p”子节点? - &GT;我有两个结果
<b>
<t></t>
<a>
<n></n>
**<p></p>**
<p></p>
</a>
<a>
<n></n>
**<p></p>**
</a>
<a></a>
</b>
为什么答案不是整个文档的第一个“p”节点?
谢谢大家!
答案 0 :(得分:0)
1:
之间的区别//a//text()
和2://a/text()
让我们分解://a
选择所有a
元素,无论它们在文档中的位置。假设您有/a
,它将选择所有根a
元素。
如果/
路径表达式位于XPath表达式中的另一个元素之后,它将在XPath表达式中选择直接降序元素之前的元素(即子元素)。
如果//
路径表达式位于XPath表达式中的另一个元素之后,它将选择前一个元素后代的所有元素,无论它们在前一个元素下的位置。
应用于两个XPath表达式:
//a//text()
:选择所有a
元素,无论它们在文档中的位置,对于这些元素,无论text()
位于a
下,都选择//a/text()
选择了元素。
a
:选择所有text()
元素,无论它们在文档中的位置,对于这些元素,请选择任何直接后代//p[1]
。
为什么
//a/p[1]
会返回每个&#34;一个节点&#34;,第一个&#34; p&#34;子节点?
假设您要编写p
,这将选择文档中任何位置的任何a
元素的第一个//p[1]
子元素。通过编写p
,您省略了显式父元素,但谓词仍然选择a
元素所具有的任何父元素的第一个子元素。
在这种情况下,有两个父p
元素,为其选择了第一个into()
子元素。
在您最喜欢的搜索引擎上搜索XPath的良好介绍会很好。我总是发现this one from w3schools.com是个好人。