contenti ha...">

How to get HTML DOM path for text content?

HTML file:

<html>
    <body>
        <div class="main">
            <p id="tID">content</p>
        </div>
    </body>
</html>

i has the string == "content",

I want to use "content"get the HTML DOM path:

html body div.main p#tID

Chrome developer tools have this function (Elements tag, bottom panel), I want to know how to do this in java?

thank you for your help:)

+3
source share
1 answer

Good luck :)

JAVA CODE

import java.io.File;

import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.DomSerializer;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;



public class Teste {

    public static void main(String[] args) {
        try {
            // read and clean document
            TagNode tagNode = new HtmlCleaner().clean(new File("test.xml"));
            Document document = new DomSerializer(new CleanerProperties()).createDOM(tagNode);

            // use XPath to find target node
            XPath xpath = XPathFactory.newInstance().newXPath();
            Node node = (Node) xpath.evaluate("//*[text()='content']", document, XPathConstants.NODE);

            // assembles jquery/css selector
            String result = "";
            while (node != null && node.getParentNode() != null) {
                result = readPath(node) + " " + result;
                node = node.getParentNode();
            }
            System.out.println(result);
            // returns html body div#myDiv.foo.bar p#tID 

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // Gets id and class attributes of this node
    private static String readPath(Node node) {
        NamedNodeMap attributes = node.getAttributes();
        String id = readAttribute(attributes.getNamedItem("id"), "#");
        String clazz = readAttribute(attributes.getNamedItem("class"), ".");
        return node.getNodeName() + id + clazz;
    }

    // Read attribute
    private static String readAttribute(Node node, String token) {
        String result = "";
        if(node != null) {
            result = token + node.getTextContent().replace(" ", token);
        }
        return result;
    }

}

XML EXAMPLE

<html>
    <body>
        <br>
        <div id="myDiv" class="foo bar">
            <p id="tID">content</p>
        </div>
    </body>
</html>

EXPLANATION

  • The object documentpoints to the XML being evaluated.
  • XPath //*[text()='content']finds everthing with text = 'content' and finds node.
  • while loops to the first node, getting the id and classes of the current element.

MORE EXPLANATIONS

+4

Source: https://habr.com/ru/post/1763190/


All Articles