Domanda

I'm using apache JXPath library to parse an XML. I'm trying to find an API in JXPath which does similar function as XPath evaluate, i.e. check if the xpath expression exists ? Its similar in the lines of

<xsl:when test="

when using xslt. Using XPath I can similarly do

XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
InputSource source = new InputSource(new StringReader(xml));
status = xpath.evaluate("/resp/status/solution", source);

If solution is not present, then it'll return status as null. Now,while using JXPath, I'm unable to figure an API in similar lines. Here's my sample code

DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder bld = dbfactory.newDocumentBuilder();

Document metaDoc = bld.parse(in);

JXPathContext metaCtx = JXPathContext.newContext(metaDoc);

Node node = (Node)metaCtx.selectSingleNode("/resp/status/solution");

This throws a "JXPathNotFoundException: No value for xpath". For implementation specific logic, I need to put and if-else block if the expression doesn't return data / doesn't exist.

Any pointer on this will be highly appreciated.

Thanks

È stato utile?

Soluzione

Try using JXPathContext.iterate(). It returns an iterator that is empty (hasNext() returns false) when there are no matching nodes. If it has at least one matching node, call next() and return that value. Otherwise return null.

Altri suggerimenti

You can prevent the JXPathNotFoundException by setting the context to Lenient:

JXPathContext context = JXPathContext.newContext(myDoc);
context.setLenient(true);

Lenient Mode The context.getValue(xpath) method throws an exception if the supplied xpath does not map to an existing property. This constraint can be relaxed by calling context.setLenient(true). In the lenient mode the method merely returns null if the path maps to nothing.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top