XPath - (// first // *)[1] vs // first // * [1]

时间:2016-11-22 14:05:02

标签: xml xpath

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>  

3 个答案:

答案 0 :(得分:2)

在这两种情况下,//first选择所有first个元素,//first//*选择first的所有元素后代。然后,差异是:

  1. (//first//*)[1]从所有这些元素中选择,只选择 第一个
  2. //first//*[1]从所有这些元素中选择,每个 第一个孩子
  3. 正如您已经看到的XML,XPath #1 选择了second,因为它是首先 {{1>的后代}}。 (您的元素名称选择有点不理想。)XPath #2 选择了firstsecond,因为它们在各自的中都是第一个兄弟姐妹

答案 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 ;;然后,对于其中的每一个,找到作为其父元素的第一个元素子元素的每个后代元素。