Java XPath Get getFastXPath(Node node)

Here you can find the source of getFastXPath(Node node)

Description

Returns a valid FastXPath that would match the given Node in its Document.

License

Open Source License

Parameter

Parameter Description
node a parameter

Return

FastXPath String

Declaration

public static String getFastXPath(Node node) 

Method Source Code

//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;
    }
}

Related

  1. getElementByXpath(Element sourceRoot, String xpathExpress)
  2. getElementsByXPath(Element parent, String name)
  3. getElementXPath(Node elt)
  4. getExcelPath()
  5. getFactory()
  6. getFirstByXPath(Object obj, String xpathExpression)
  7. getFullXPath(Node n)
  8. getHtmlXPath()
  9. getInt(Object node, XPathExpression expression)