XPath -
(//first//*)[1]
和//first//*[1]
之间有什么区别?
它是如何工作的?
示例XML文件是:
<root>
<first>
<second>
Test
</second>
<second>
<third>Test2</third>
</second>
</first>
</root>
(// first // *)[1]给出:
<second>
Test
</second>
但//首先// * [1]给出:
<second>
Test
</second>
<third>Test2</third>
答案 0 :(得分:2)
在这两种情况下,//first
选择所有first
个元素,//first//*
选择first
的所有元素后代。然后,差异是:
(//first//*)[1]
从所有这些元素中选择,只选择 第一个 。//first//*[1]
从所有这些元素中选择,每个 第一个孩子 。正如您已经看到的XML,XPath #1 选择了second
,因为它是首先 {{1>的后代}}。 (您的元素名称选择有点不理想。)XPath #2 选择了first
和second
,因为它们在各自的中都是第一个兄弟姐妹强>
答案 1 :(得分:1)
(//first//*)[1] - returns first element found no matter where
例如,如果您在页面的不同部分找到多个元素,它将返回第一个找到的元素。
//first//*[1] - returns first element form each section
例如,如果您在页面的不同部分找到了多个元素,它将从每个部分返回第一个元素。在您的示例中,来自<second>
的第一个元素<first>
和来自<second>
的第一个元素。
如果你在它们之间切换2秒,它应该返回相同的。
通常你会使用
//first//*[1]
来获取列表中的第一个元素(同一级别的元素)。
答案 2 :(得分:1)
//
表示/descendant-or-self::node()/
。因此//first//*[1]
表示/descendant-or-self::node()/child::first/descendant-or-self::node()/child::*[1]
。
比#34; /&#34;更紧密地预测绑定,所以这意味着
/descendant-or-self::node()/
child::first/
descendant-or-self::node()/
(child::*[1])
非正式地:找到所有名为&#34; first&#34 ;;然后,对于其中的每一个,找到作为其父元素的第一个元素子元素的每个后代元素。