2016-11-22 71 views
1

XPath - (//first//*)[1]//first//*[1]有什麼區別? 它是如何工作的?XPath - (// first // *)[1] vs // first // * [1]

的樣本XML文件是:

<root> 
    <first> 
      <second> 
       Test 
      </second> 

      <second> 
       <third>Test2</third> 
     </second> 

    </first> 
</root> 

(//第一// *)[1]給出:

<second> 
Test 
</second> 

但//第一// * [1]得出:

<second> 
    Test 
    </second> 
<third>Test2</third> 

回答

2

在兩種情況下,//first選擇所有first元件,並且//first//*選擇的first所有元素後代。然後,所不同的是:從所有這些元素的

  1. (//first//*)[1]選擇,只有第一
  2. //first//*[1]從所有這些元素中選擇,每第一個孩子

正如你已經看到了你的XML,second由XPath的#選擇1,因爲它是首先first後代。 (您的元素名稱選擇有點不理想。)XPath #2選擇secondthird,因爲它們都是,它們各自的兄弟中的第一個。

+0

非常感謝!括號使得xpath像整體一樣解析它,但//首先// * [1]會相對於每個節點解析? – Vivyen

+0

正確,謂詞'[1]'比'/'綁定的更緊密,所以沒有parens,**第一個孩子**是默認的,而不僅僅是第一個**。 – kjhughes

1
(//first//*)[1] - returns first element found no matter where 

例如,如果您在頁面的不同部分找到多個元素,它將返回第一個找到的元素。

//first//*[1] - returns first element form each section 

例如,如果在頁面的不同部分中找到多個元素,它將返回每個部分的第一個元素。在您的示例第一個元素<second><first>和第一個元素從<second>

如果您切換它們之間2秒鐘,它應該返回相同。

通常您會使用//first//*[1]從列表中獲取第一個元素(同一級別的元素)。

1

//表示/descendant-or-self::node()/。所以//first//*[1]意味着/descendant-or-self::node()/child::first/descendant-or-self::node()/child::*[1]

謂詞結合更緊密地大於 「/」,所以這意味着

/descendant-or-self::node()/ child::first/ descendant-or-self::node()/ (child::*[1])

非正式:發現所有稱爲 「第一」 元素;那麼對於其中的每一個,找到每個後代元素,它是其父代的第一個元素子代。