I use a lot of XPath when locating elements in web pages using Selenium, and have moved away from using node1//node2 towards using node1/descendant::node2 more recently. What's the difference between the two methods? Is one more efficient than the other?
Example XML snippet to demonstrate:
<div id="books"> <table> <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr> <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr> </table> </div>
So it'd be:
id('books')//td[@class='title']
or:
id('books')/descendant::td[@class='title']
The descendant axis indicates all of the children of the context node, and all of their children, and so forth. Attribute and namespace nodes are not included - the parent of an attribute node is an element node, but attribute nodes are not the children of their parents.
following:: will select all of the nodes that come after the context node and their descendant's, but that does not include the context node's descendants. descendant:: will select all of the nodes along the child:: axis, as well as their children, and their children's children, etc..
In XPath, there are seven kinds of nodes: element, attribute, text, namespace, processing-instruction, comment, and document nodes. XML documents are treated as trees of nodes. The topmost element of the tree is called the root element.
The preceding axis selects all nodes that come before the current node in the document, except ancestor, attribute nodes, and namespace nodes.
see http://www.w3.org/TR/xpath#path-abbrev
// is just an abbreviation for the descendant:: axis
Edit
To quote:
//para is short for /descendant-or-self::node()/child::para
That is, it refers to all para which are a child of the context node or any node descended from the context node. As far as I can tell that translates into any descendant para of the context node.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With