繁体   English   中英

从 Java 向 XPath 发送一个变量

[英]Sending XPath a variable from Java

我有一个搜索静态值的 XPath 表达式。 在这个例子中,“test”就是那个值:

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

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

您可以定义一个变量解析器并让表达式的计算解析变量,例如$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);

我使用类似于@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());
}

除了这里的这个答案,它很好地解释了如何使用标准 Java API 做到这一点,您还可以使用像jOOX这样的第三方库,它可以以简单的方式处理变量:

List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM