我正在使用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阻塞。
任何指针都将受到高度赞赏。
由于
答案 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。