从 Java 向 XPath 发送变量
我有一个搜索静态值的XPath表达式。在此示例中,“test”是该值:
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
如何传递变量而不是固定字符串?我将Java与Eclipse一起使用。有没有办法使用Java的值来声明XPath变量?String
我有一个搜索静态值的XPath表达式。在此示例中,“test”是该值:
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
如何传递变量而不是固定字符串?我将Java与Eclipse一起使用。有没有办法使用Java的值来声明XPath变量?String
您可以定义一个变量解析器,并计算表达式 resolve 变量,例如:$myvar
XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
这里有一个相当好的解释。在我自己之前,我实际上还没有这样做过,所以我可能会尝试提供一个更完整的示例。
更新:
一试,工作是一种享受。对于一个非常简单的实现的示例,您可以定义一个从映射返回给定变量值的类,如下所示:
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
好问题,我自己学到了一些有用的东西!
您不需要评估Java(或XPath中的任何其他PL变量)。在C#中(不太了解Java),我将使用:
string XPathExpression =
"//doc[contains(., " + myVar.ToString() + ")]/*/text()";
XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);