Java XPath Find findNode(String xPathExpression, Element root)

Here you can find the source of findNode(String xPathExpression, Element root)

Description

Checks in under a given root element whether it can find a child node which matches the XPath expression supplied.

License

Apache License

Parameter

Parameter Description
xPathExpression the xPathExpression (required)
root the parent DOM element (required)

Return

the Node if discovered (null if not found)

Declaration

public static Node findNode(String xPathExpression, Element root) 

Method Source Code

//package com.java2s;
/**/*  w w w  . j a  va  2  s . c  o m*/
 * Copyright (C) 2010 http://flowas.net/
 *
 * Licensed 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.
 *
 * You can write to flowas@gmial.com for more customer requirement.
 */

import java.util.HashMap;

import java.util.Map;

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

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

public class Main {
    private static final Map<String, XPathExpression> compiledExpressionCache = new HashMap<String, XPathExpression>();
    private static final XPath xpath = XPathFactory.newInstance().newXPath();

    /**
     * Checks in under a given root element whether it can find a child node
     * which matches the XPath expression supplied. Returns {@link Node} if
     * exists.
     * 
     * Please note that the XPath parser used is NOT namespace aware. So if you
     * want to find a element <beans><sec:http> you need to use the following
     * XPath expression '/beans/http'.
     * 
     * @param xPathExpression the xPathExpression (required)
     * @param root the parent DOM element (required)
     * 
     * @return the Node if discovered (null if not found)
     */
    public static Node findNode(String xPathExpression, Element root) {
        if (xPathExpression == null || root == null || xPathExpression.length() == 0) {
            throw new IllegalArgumentException("Xpath expression and root element required");
        }
        Node node = null;
        try {
            XPathExpression expr = compiledExpressionCache.get(xPathExpression);
            if (expr == null) {
                expr = xpath.compile(xPathExpression);
                compiledExpressionCache.put(xPathExpression, expr);
            }
            node = (Node) expr.evaluate(root, XPathConstants.NODE);
        } catch (XPathExpressionException e) {
            throw new IllegalArgumentException("Unable evaluate xpath expression", e);
        }
        return node;
    }
}

Related

  1. findAll(Node node, String xpath)
  2. findAll(Node root, String xPath)
  3. findNodeByXPath(Node base, String xpath)
  4. findNodeByXpath(String xpathExpression, String fileName)
  5. findNodeByXPath(String xPathString, Object source)
  6. findNodes(final Node node, final String expression)