Here you can find the source of getFastXPath(Node node)
Parameter | Description |
---|---|
node | a parameter |
public static String getFastXPath(Node node)
//package com.java2s; /**//from www.jav a2 s . co m * WS-Attacker - A Modular Web Services Penetration Testing Framework Copyright * (C) 2013 Christian Mainka * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 51 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.Node; public class Main { /** * Returns a valid FastXPath that would match the given Node in its Document. * * @param node * @return FastXPath String */ public static String getFastXPath(Node node) { StringBuffer buf = new StringBuffer(); Element ele; switch (node.getNodeType()) { case Node.ELEMENT_NODE: ele = (Element) node; break; case Node.ATTRIBUTE_NODE: buf.append("/@"); buf.append(node.getNodeName()); buf.append("=\""); buf.append(node.getTextContent()); buf.append('"'); ele = ((Attr) node).getOwnerElement(); break; case Node.TEXT_NODE: buf.append("/text()"); ele = (Element) node.getParentNode(); break; default: throw new IllegalArgumentException( String.format("Node '%s' is of Type %s", node.getNodeName(), node.getNodeType())); } int index = getElementIndex(ele); buf.append(ele.getNodeName() + "[" + index + "]"); Node parent = ele.getParentNode(); // while (parent != ele.getOwnerDocument()) while (parent != null && parent.getNodeType() == Node.ELEMENT_NODE) { index = getElementIndex((Element) parent); buf.insert(0, parent.getNodeName() + "[" + index + "]/"); parent = parent.getParentNode(); } buf.insert(0, "/"); return buf.toString(); } /** * Returns the index of the Node within the current sub-tree. Mainly used for creating FastXPath expressions ( * {@link #getFastXPath(Node)}) * * @param ele * @return */ public static int getElementIndex(Element ele) { int index = 1; Node prev = ele.getPreviousSibling(); while (prev != null) { if (prev.getNodeType() == Node.ELEMENT_NODE) { if (((Element) prev).getNodeName().equals(ele.getNodeName())) { ++index; } } prev = prev.getPreviousSibling(); } return index; } }