JAXP supports XPath 1.0 query evaluation with package javax.xml.xpath. To evaluate a query, follow these steps:
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression queryExpression = xpath.compile(query);where query is a string containing an XPath statement. You may skip this step and do the compilation at execution time. However, it is more efficient to compile a query once and then evaluate it several times;
queryExpression.evaluate(document, resultType);where document is either a Node object (for DOM representations) or an InputSource object (for SAX representations), and resultType is the result type of the query. The possible result types are the following:
The following XPathEval evaluates an XPath query against an XML document and serializes the answer in a well-formed XML document, which is printed on the standard output (the parsing of the document is associated to the error handler ValidHandler):
import java.io.*;
import javax.xml.xpath.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class XPathEval {
static final String usage =
"Syntax: java XPathEval query -r (nodeset|string|number|boolean) document.xml";
public static void main(String[] args) {
if (args.length != 3) {
System.out.println(usage);
System.exit(1);
}
if (!(args[1].equals("nodeset") || args[1].equals("string") ||
args[1].equals("number") || args[1].equals("boolean"))) {
System.out.println(usage);
System.exit(1);
}
String query = args[0];
String resultType = args[1];
String documentName = args[2];
// get an XPath factory
XPathFactory factory = XPathFactory.newInstance();
// get an XPath evaluator
XPath xpath = factory.newXPath();
// compile the XPath query
XPathExpression queryExpression = null;
try {
queryExpression = xpath.compile(query);
} catch (XPathExpressionException xee) {
// compilation failure
System.err.println("Compilation failure: " + xee.getMessage());
System.exit(1);
}
// parse the document
DocumentBuilder parser = null;
try {
parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException pce) {
// compilation failure
System.err.println(pce.getMessage());
System.exit(1);
}
// register an error handler with the parser
parser.setErrorHandler(new ValidHandler());
Document document = null;
try {
document = parser.parse(new File(documentName));
} catch (SAXException se) {
// do nothing since an error handler has been installed
} catch (IOException ioe) {
// Some IO error occurred
System.err.println(ioe.getMessage());
System.exit(1);
}
// evaluate the query according to its result type
Object result = null;
try {
if (resultType.equals("nodeset")) {
result = (NodeList)
queryExpression.evaluate(document, XPathConstants.NODESET);
}
if (resultType.equals("number")) {
result = (Double) queryExpression.evaluate(document, XPathConstants.NUMBER);
}
if (resultType.equals("string")) {
result = (String) queryExpression.evaluate(document, XPathConstants.STRING);
}
if (resultType.equals("boolean")) {
result = (Boolean) queryExpression.evaluate(document, XPathConstants.BOOLEAN);
}
} catch (XPathExpressionException xee) {
// evaluation failure
System.err.println("Evaluation failure: " + xee.getMessage());
System.exit(1);
}
// create an answer document
Document answer = parser.newDocument();
Element answerNode = answer.createElement("answer");
if (resultType.equals("nodeset")) {
NodeList answerNodeSet = (NodeList) result;
int card = answerNodeSet.getLength();
for(int i = 0; i < card; i++) {
Node n = answerNodeSet.item(i);
if (n.getNodeType() == Node.ATTRIBUTE_NODE) {
Element attribute = answer.createElement("attribute");
attribute.setAttribute(n.getNodeName(), n.getNodeValue());
answerNode.appendChild(attribute);
} else {
answerNode.appendChild(answer.importNode(n, true));
}
}
}
if (resultType.equals("number")) {
Double resultNumber = (Double) result;
answerNode.appendChild(answer.createTextNode(resultNumber.toString()));
}
if (resultType.equals("string")) {
String resultString = (String) result;
answerNode.appendChild(answer.createTextNode(resultString));
}
if (resultType.equals("boolean")) {
Boolean resultBoolean = (Boolean) result;
answerNode.appendChild(answer.createTextNode(resultBoolean.toString()));
}
answer.appendChild(answerNode);
Transformer transformer = null;
try {
transformer = TransformerFactory.newInstance().newTransformer();
} catch (TransformerConfigurationException tce) {
// the transformer cannot be created
System.err.println(tce.getMessage());
System.exit(1);
}
DOMSource input = new DOMSource(answer);
StreamResult output = new StreamResult(System.out);
try {
transformer.transform(input, output);
} catch (TransformerException te) {
// transformation failure
System.err.println("Transformation failure: " + te.getMessage());
System.exit(1);
}
}
}