Here you can find the source of getXPathForNode(Node node)
Parameter | Description |
---|---|
node | the input node. |
public static String getXPathForNode(Node node)
//package com.java2s; /*/*w w w . j av a 2 s.co m*/ * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class Main { /** * Does a reverse walking of the DOM tree to generate a unique XPath * expression leading to this node. The XPath generated is the canonical * one based on sibling index: /html[1]/body[1]/div[2]/span[3] etc.. * * @param node the input node. * @return the XPath location of node as String. */ public static String getXPathForNode(Node node) { final StringBuilder sb = new StringBuilder(); Node parent = node; while (parent != null && parent.getNodeType() != Node.DOCUMENT_NODE) { sb.insert(0, "]"); sb.insert(0, getIndexInParent(parent) + 1); sb.insert(0, "["); sb.insert(0, parent.getNodeName()); sb.insert(0, "/"); parent = parent.getParentNode(); } return sb.toString(); } /** * Given a node this method returns the index corresponding to such node * within the list of the children of its parent node. * * @param n the node of which returning the index. * @return a non negative number. */ public static int getIndexInParent(Node n) { Node parent = n.getParentNode(); if (parent == null) { return 0; } NodeList nodes = parent.getChildNodes(); int counter = -1; for (int i = 0; i < nodes.getLength(); i++) { Node current = nodes.item(i); if (current.getNodeType() == n.getNodeType() && current.getNodeName().equals(n.getNodeName())) { counter++; } if (current.equals(n)) { return counter; } } throw new IllegalStateException("Cannot find a child within its parent node list."); } }