Sending XPath a variable from Java

后端 未结 3 676
旧巷少年郎
旧巷少年郎 2020-12-03 21:24

I have an XPath expression that searches for a static value. In this example, \"test\" is that value:

XPathExpression expr = xpath.compile(\"//doc[contains(.         


        
相关标签:
3条回答
  • 2020-12-03 22:01

    Apart from this answer here, that explains well how to do it with the standard Java API, you could also use a third-party library like jOOX that can handle variables in a simple way:

    List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();
    
    0 讨论(0)
  • 2020-12-03 22:11

    You can define a variable resolver and have the evaluation of the expression resolve variables such as $myvar, for example:

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

    There's a fairly good explanation here. I haven't actually done this before myself, so I might have a go and provide a more complete example.


    Update:

    Given this a go, works a treat. For an example of a very simple implementation, you could define a class that returns the value for a given variable from a map, like this:

    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);
      }
    }
    

    Now, declare and initialise an instance of this resolver in the program, for example

    MapVariableResolver vr = new MapVariableResolver() ;
    vr.setVariable("myVar", "text");
    ...
    XPath xpath = factory.newXPath();
    xpath.setXPathVariableResolver(vr);
    

    Then, during evaluation of the XPath expression XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");, the variable $myVar will be replaced with the string text.

    Nice question, I learnt something useful myself!

    0 讨论(0)
  • 2020-12-03 22:12

    You don't need to evaluate Java (or whatever else PL variables in XPath). In C# (don't know Java well) I'll use:

        string XPathExpression = 
    "//doc[contains(., " + myVar.ToString() + ")]/*/text()";
    
        XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);
    
    0 讨论(0)
提交回复
热议问题