我有一个XPath表达式,用于搜索静态值。在此示例中,“test”是该值:
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
如何传递变量而不是固定字符串?我在Eclipse中使用Java。有没有办法使用Java String
的值来声明XPath变量?
答案 0 :(得分:18)
您可以定义变量解析器并对表达式求解变量(例如$myvar
)进行评估,例如:
XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
有一个相当不错的解释here。我之前并没有真正做到这一点,所以我可能会去做一个更完整的例子。
更新
考虑到这一点,一个好吃的。有关非常简单的实现的示例,您可以定义一个类,该类从地图返回给定变量的值,如下所示:
class MapVariableResolver implements XPathVariableResolver {
// local store of variable name -> variable value mappings
Map<String, String> variableMappings = new HashMap<String, String>();
// a way of setting new variable mappings
public void setVariable(String key, String value) {
variableMappings.put(key, value);
}
// override this method in XPathVariableResolver to
// be used during evaluation of the XPath expression
@Override
public Object resolveVariable(QName varName) {
// if using namespaces, there's more to do here
String key = varName.getLocalPart();
return variableMappings.get(key);
}
}
现在,在程序中声明并初始化此解析程序的实例,例如
MapVariableResolver vr = new MapVariableResolver() ;
vr.setVariable("myVar", "text");
...
XPath xpath = factory.newXPath();
xpath.setXPathVariableResolver(vr);
然后,在评估XPath表达式XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
期间,变量$myVar
将替换为字符串text
。
好问题,我自己学到了一些有用的东西!
答案 1 :(得分:0)
您不需要评估Java(或XPath中的任何其他PL变量)。在C#中(不熟悉Java)我将使用:
string XPathExpression =
"//doc[contains(., " + myVar.ToString() + ")]/*/text()";
XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);
答案 2 :(得分:0)
除了这个answer here,它解释了如何使用标准Java API,您还可以使用像jOOX这样的第三方库,它可以以一种简单的方式处理变量:< / p>
List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();
答案 3 :(得分:0)
我使用类似于@brabster 的东西:
// expression: "/message/PINConfiguration/pinValue[../keyReference=$keyReference]";
Optional<Node> getNode(String xpathExpression, Map<String, String> variablesMap)
throws XPathExpressionException {
XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setXPathVariableResolver(qname -> variablesMap.get(qname.getLocalPart()));
return Optional.ofNullable((Node) xpath.evaluate(xpathExpression, document,
XPathConstants.NODE));
}
Optional<Node> getNode(String xpathExpression) throws XPathExpressionException {
return getNode(xpathExpression, Collections.emptyMap());
}