从Java发送XPath变量

我有一个XPath表达式,用于搜索静态值。 在此示例中,“test”是该值:

XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()"); 

如何传递变量而不是固定字符串? 我在Eclipse中使用Java。 有没有办法使用Java String的值来声明XPath变量?

您可以定义变量解析器并对表达式$myvar变量(例如$myvar )进行$myvar ,例如:

XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");

这里有一个相当不错的解释。 我之前没有真正做到这一点,所以我可能会有一个更好的例子。


更新:

鉴于这一点,一个好吃的。 有关非常简单的实现的示例,您可以定义一个类,该类从地图返回给定变量的值,如下所示:

 class MapVariableResolver implements XPathVariableResolver { // local store of variable name -> variable value mappings Map variableMappings = new HashMap(); // 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 list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();