从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();