blob: 50cbddabdc4e1cb53e3bb6a8f1843ba2df381f27 [file] [log] [blame]
/*
* 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 javax.xml.namespace.*;
import javax.xml.xpath.*;
import java.util.Iterator;
/**
* JAXP 1.3 XPath API sample.
*
* This sample demonstrates the use of NamespaceContext, XPathFunctionResolver
* and XPathVariableResolver. The evaluated XPath expression ("ex:addFunc(2, 3) + $xyz")
* contains an extension function and a variable reference. The extension function
* and variable are evaluated using our customized XPathFunctionResolver and
* XPathVariableResolver respectively. A NamespaceContext implementation is also
* needed to map the prefix in the extension function to a valid namespace uri.
*/
public class XPathResolver
{
/**
* The XPath expression to evaluate, which contains an extension
* function and a variable reference.
*/
private static final String EXPR = "ex:addFunc(2, 3) + $xyz";
/**
* The NamespaceContext implementation is used to map the prefix "ex"
* to the namespace uri "http://ex.com".
*/
public static class MyNamespaceContext implements NamespaceContext
{
public String getNamespaceURI(String prefix)
{
if (prefix == null)
throw new IllegalArgumentException("The prefix cannot be null.");
if (prefix.equals("ex"))
return "http://ex.com";
else
return null;
}
public String getPrefix(String namespace)
{
if (namespace == null)
throw new IllegalArgumentException("The namespace uri cannot be null.");
if (namespace.equals("http://ex.com"))
return "ex";
else
return null;
}
public Iterator getPrefixes(String namespace)
{
return null;
}
}
/**
* The XPathFunctionResolver implementation is used to evaluate
* the extension function "ex:addFunc(2, 3)".
*/
public static class MyFunctionResolver implements XPathFunctionResolver
{
/**
* This method returns a customized XPathFunction implementation
* for the extension function "ex:addFunc()".
*/
public XPathFunction resolveFunction(QName fname, int arity)
{
if (fname == null)
throw new NullPointerException("The function name cannot be null.");
// We only recognize one function, i.e. ex:addFunc().
if (fname.equals(new QName("http://ex.com", "addFunc", "ex")))
/**
* Return a customized implementation of XPathFunction. We need
* to implement the evaluate(List) method.
*/
return new XPathFunction() {
/**
* The actual implementation of the extension function.
* Just cast two arguments to Double and add them together.
*/
public Object evaluate(java.util.List args) {
if (args.size() == 2) {
Double arg1 = (Double)args.get(0);
Double arg2 = (Double)args.get(1);
return new Double(arg1.doubleValue() + arg2.doubleValue());
}
else
return null;
}
};
else
return null;
}
}
/**
* Our own implementation of XPathVariableResolver, which resolves the
* variable "xyz" to a double value 4.0.
*/
public static class MyVariableResolver implements XPathVariableResolver
{
public Object resolveVariable(QName varName)
{
if (varName == null)
throw new NullPointerException("The variable name cannot be null.");
if (varName.equals(new QName("", "xyz")))
return new Double(4.0);
else
return null;
}
}
public static void main(String[] args)
{
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
// Set the NamespaceContext
xpath.setNamespaceContext(new MyNamespaceContext());
// Set the function resolver
xpath.setXPathFunctionResolver(new MyFunctionResolver());
// Set the variable resolver
xpath.setXPathVariableResolver(new MyVariableResolver());
Object result = null;
try {
result = xpath.evaluate(EXPR, (Object)null, XPathConstants.NUMBER);
}
catch (Exception e) {
e.printStackTrace();
}
// The evaluation result is 9.0.
System.out.println("The evaluation result: " + result);
}
}