我有一个XPath表达式来搜索一个静态值。在这个例子中,“测试”是价值:从Java发送XPath变量
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
我如何传递一个变量,而不是一个固定的字符串的?我在Eclipse中使用Java。有没有办法使用Java String
的值来声明XPath变量?
我有一个XPath表达式来搜索一个静态值。在这个例子中,“测试”是价值:从Java发送XPath变量
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
我如何传递一个变量,而不是一个固定的字符串的?我在Eclipse中使用Java。有没有办法使用Java String
的值来声明XPath变量?
你可以定义一个变量解析器和有决心的表达等变量$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
替换。
不错的问题,我学到了一些有用的东西!
您不需要评估Java(或其他XPath中的PL变量)。在C#中(不知道Java的好)我会使用:
string XPathExpression =
"//doc[contains(., " + myVar.ToString() + ")]/*/text()";
XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);
除此之外,这很好地解释了如何使用标准的Java API做到这一点,你也可以使用第三方库像jOOX能以简单的方式处理变量:
List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();
我找到的变量有点麻烦简单的内联,相对于使用真实变量的可能性。此外,你必须考虑句法完整性(例如,如果'myVar'包含引号?等等) – 2012-01-20 14:14:17