如何使用Xpath库评估xpath表达式

时间:2011-10-11 22:23:26

标签: java xpath jxpath

我正在使用apache JXPath库来解析XML。我正在尝试在JXPath中找到一个与XPath评估功能类似的API,即检查xpath表达式是否存在?

中的类似
<xsl:when test="

使用xslt时。使用XPath我可以类似地做

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

如果解决方案不存在,那么它将返回状态为null。 现在,在使用JXPath时,我无法在类似的行中找到API。这是我的示例代码

DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

DocumentBuilder bld = dbfactory.newDocumentBuilder();

文档metaDoc = bld.parse(in);

JXPathContext metaCtx = JXPathContext.newContext(metaDoc);

节点node =(Node)metaCtx.selectSingleNode(“/ resp / status / solution”);

这会抛出“JXPathNotFoundException:xpath没有值”。对于特定于实现的逻辑,如果表达式没有返回数据/不存在,我需要put和if-else阻塞。

任何指针都将受到高度赞赏。

由于

2 个答案:

答案 0 :(得分:4)

您可以通过将上下文设置为JXPathNotFoundException来阻止Lenient

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

宽松模式如果,则context.getValue(xpath)方法抛出异常   提供的xpath不会映射到现有属性。这个   可以通过调用context.setLenient(true)来放宽约束。在里面   宽松模式如果路径映射到该方法,则该方法仅返回null   什么都没有。

答案 1 :(得分:2)

尝试使用JXPathContext.iterate()。当没有匹配的节点时,它返回一个空的迭代器(hasNext()返回false)。如果它至少有一个匹配节点,则调用next()并返回该值。否则返回null。