/* * Copyright 2005-2011 the original author or authors. * * 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. */ package org.wamblee.xml; import javax.xml.namespace.NamespaceContext; import javax.xml.namespace.QName; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * XPath expression. * * @author Erik Brakkee */ public class XPathExpression { private String expressionString; private javax.xml.xpath.XPathExpression expression; /** * Constructs the expression. Users typically use {@link XPathContext#createExpression(String)} instead * of this constructor. * * @param aXpath Xpath interface. * @param aExpression Expression. * @throws XMLException In case of problems. */ public XPathExpression(XPath aXpath, String aExpression) throws XMLException { expressionString = aExpression; try { expression = aXpath.compile(aExpression); } catch (XPathExpressionException e) { throw new XMLException("Could not compile xpath expression '" + aExpression + "'", e); } } /** * Evaluates the xpath expression to a string. * @param aDocument Document * @return Value. * @throws XMLException In case of problems. */ public String stringEval(XMLDocument aDocument) throws XMLException { return (String)evaluateImpl(aDocument, XPathConstants.STRING); } /** * Evaluates the xpath expression to a boolean. * @param aDocument Document * @return Value. * @throws XMLException In case of problems. */ public boolean booleanEval(XMLDocument aDocument) throws XMLException { return (Boolean)evaluateImpl(aDocument, XPathConstants.BOOLEAN); } /** * Evaluates the xpath expression to a node list. * @param aDocument Document * @return Value. * @throws XMLException In case of problems. */ public NodeList nodelistEval(XMLDocument aDocument) throws XMLException { return (NodeList)evaluateImpl(aDocument, XPathConstants.NODESET); } /** * Evaluates the xpath expression to a Node. * @param aDocument Document * @return Value. * @throws XMLException In case of problems. */ public Node nodeEval(XMLDocument aDocument) throws XMLException { return (Node)evaluateImpl(aDocument, XPathConstants.NODE); } /** * Evaluates the xpath expression to a number. * @param aDocument Document * @return Value. * @throws XMLException In case of problems. */ public Double numberEval(XMLDocument aDocument) throws XMLException { return (Double)evaluateImpl(aDocument, XPathConstants.NUMBER); } /** * @return Low-level xpath expression object. */ public javax.xml.xpath.XPathExpression getExpression() { return expression; } /** * @return XPath expression. */ public String getExpressionString() { return expressionString; } private Object evaluateImpl(XMLDocument aDocument, QName aResultType) throws XMLException { try { return expression.evaluate(aDocument.getDocument(), aResultType); } catch (XPathExpressionException e) { throw new XMLException("Problem evaluating expression '" + expressionString + "' on document '" + aDocument.print(true) + "'", e); } } }