Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending XPath a variable from Java

Tags:

java

xml

xpath

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

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

How can I pass a variable instead of a fixed string? I use Java with Eclipse. Is there a way to use the value of a Java String to declare an XPath variable?

like image 513
Lollo Avatar asked Jul 03 '10 08:07

Lollo


People also ask

How do you pass a Java variable in XPath?

Here is some code to make it clear: String newUser = "NewUser123"; driver. findElement(By. xpath("//td[normalize-space(text())=**newUser**]/a")).

How do you give variables in XPath?

XPath is a strong tool in itself, but you can even use variables in your XPath expressions. The way it works is by referring to a variable as: $variable. You use the variable element to assign a value to a variable. Variables are case sensitive, so e.g. $var is not the same as $Var.

How do you pass a parameter into XPath?

Just call getElementByXpathContainsText() by passing any xpath as parameter.

What is XPath parsing?

It defines a language to find information in an XML file. It is used to traverse elements and attributes of an XML document.


1 Answers

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!

like image 169
brabster Avatar answered Sep 27 '22 21:09

brabster