How to get node value / innerHTML with XPath?

86,666

Solution 1

With xpath, the thing you will get returned is the last thing in the path that is not a condition. What that means? Well, conditions are the stuff between []'s (but you already knew that) and yours reads like pathElement[that has a 'class' attribute with value 'my class']. The pathElement comes directly before the [.

All the stuff outside of []'s then is the path, so in //a/b/c[@blah='bleh']/d a, b, c and d are all path elements, blah is an attribute and bleh a literal value. If this path matches it will return you a d, the last non-condition thing.

Your particular path returns a (series of) div, being the last thing in your xpath's path. This return value thus includes the top-level node(s), div in your case, and underneath it (them) all its (their) children. Nodes can be elements or text (or comments, processing instructions, ...).

Underneath a node there can be multiple text nodes, hence the array pOcHa talks about. x/text() returns all text that is a direct child of x, x/node() returns all child nodes, including text.

Solution 2

node() = innerXml

text() = innerText

both are arrays, so text()[1] is a first children text node...

Solution 3

New answer to an old, frequently asked question:

For this XML

<div class="myclass">content</div>

you can use XPath to select just content in one of two ways:

  1. Text Node Selection

    This XPath,

    //div[@class='myclass']/text()
    

    will select the text node children of the targeted div element, content, as requested.

  2. String Value of an Element

    This XPath,

    string(//div[@class='myclass'])
    

    will return string-value of the targeted div element, content, again as requested.

    Further information: Here's a note explaining the string-values of elements:

    The string-value of an element node is the concatenation of the string-values of all text node descendants of the element node in document order.

Solution 4

You can try

//div[@class='myclass']/child::*

child::* selects all element children of the context node see details

Share:
86,666
Tom Smykowski
Author by

Tom Smykowski

Updated on June 05, 2020

Comments

  • Tom Smykowski
    Tom Smykowski about 4 years

    I have a XPath to select to a class I want: //div[@class='myclass']. But it returns me the whole div (with the <div class='myclass'> also, but I would like to return only the contents of this tag without the tag itself. How can I do it?

  • CodeManX
    CodeManX over 10 years
    How would multiple text nodes look like in XML? Would text() return a concatination of all innerTexts that a children of the selected node?
  • Nikola Bogdanović
    Nikola Bogdanović over 10 years
    @CoDEmanX: <div>text1<span>text2</span>text3</div> as I said, it is an array, so div/node()[0] == div/text()[0] == text1 node, and div/node()[1] == span node, and div/node()[2] == div/text()[1] == text3 node - you would have to concatenate them yourself (by hand or with a helper function that accepts an array).
  • chainstair
    chainstair about 4 years
    King ... You helped me with string(xpath) 🔥