Java HTML / XML How to - Get XPath of XML Tag








Question

We would like to know how to get XPath of XML Tag.

Answer

import java.io.ByteArrayInputStream;
/*from w w  w  . jav  a2  s .c o m*/
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class Main {
  private static String getXPath(Node root, String elementName) {
    for (int i = 0; i < root.getChildNodes().getLength(); i++) {
      Node node = root.getChildNodes().item(i);
      if (node instanceof Element == false) {
        return null;
      }
      if (node.getNodeName().equals(elementName)) {
        return "/" + node.getNodeName();
      } else if (node.getChildNodes().getLength() > 0) {
        String xpath = getXPath(node, elementName);
        if (xpath != null) {
          return "/" + node.getNodeName() + xpath;
        }
      }
    }
    return null;
  }
  private static String getXPath(Document document, String elementName) {
    return document.getDocumentElement().getNodeName()
        + getXPath(document.getDocumentElement(), elementName);
  }

  public static void main(String[] args) throws Exception {
    Document document = DocumentBuilderFactory
        .newInstance()
        .newDocumentBuilder()
        .parse(
            new ByteArrayInputStream(
                ("<foo><foo1>Foo Test 1</foo1><foo2><another1><test1>Foo Test 2</test1></another1></foo2><foo3>Foo Test 3</foo3><foo4>Foo Test 4</foo4></foo>")
                    .getBytes()));
    String xpath = "/" + getXPath(document, "test1");
    Node node1 = (Node) XPathFactory.newInstance().newXPath().compile(xpath)
        .evaluate(document, XPathConstants.NODE);
    Node node2 = (Node) XPathFactory.newInstance().newXPath()
        .compile("//test1").evaluate(document, XPathConstants.NODE);
    System.out.println(node1.equals(node2));
  }
}