Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the XPath expression to find only the first occurrence?

I used this Xpath expression "//span[@class='Big']" and got all elements in that page that are under <span> tag and class='Big'.

My question is what if I want just the first occurrence on the page, not all occurrences, what would be the correct Xpath expression?

Thanks, Narin

like image 691
Narin Avatar asked Jan 12 '13 15:01

Narin


People also ask

Which button is used to find the first occurrence of the data?

To open the Find function, use the shortcut Ctrl+F or navigate to Home>Editing>Find.

How do I select the first child in XPath?

The key part of this XPath is *[1] , which will select the node value of the first child of Department .

How do I select the second element in XPath?

//div[@class='content'][2] means: Select all elements called div from anywhere in the document, but only the ones that have a class attribute whose value is equal to "content". Of those selected nodes, only keep those which are the second div[@class = 'content'] element of their parent.

What does * indicate in XPath?

The XPath default axis is child , so your predicate [*/android.widget.TextView[@androidXtext='Microwaves']] is equivalent to [child::*/child::android.widget.TextView[@androidXtext='Microwaves']] This predicate will select nodes with a android. widget. TextView grandchild and the specified attribute.


2 Answers

The correct answer (note the brackets):

(//span[@class='Big'])[1] 

The following expression is wrong in the general case:

//span[@class='Big'][1] 

because it selects every span element in the document, that satisfies the condition in the first predicate, and that is the first such child of its parent -- there can be many such elements in an XML document and all of them will be selected.

For more detailed explanation see: https://stackoverflow.com/a/5818966/36305

like image 114
Dimitre Novatchev Avatar answered Sep 26 '22 02:09

Dimitre Novatchev


Dimitre Novatchev's answer is correct if you are expecting the class attribute to be equal to Big (without any other classes attached to the element):

(//span[@class="Big"])[1] 

... which is similar to the following JavaScript expression:

document.querySelectorAll('span[class="Big"]')[0] 

On the other hand, if you are expecting Big to be one of any number of classes in the class attribute (rather than the only class), you can use the following expression:

(//span[contains(concat(" ", normalize-space(@class), " "), " Big ")])[1] 

... which is similar to the following JavaScript expression:

document.querySelectorAll('span.Big')[0] 
like image 44
Grant Miller Avatar answered Sep 26 '22 02:09

Grant Miller