tags:

views:

43

answers:

3

Hi, i have an xpath expression that search a static value, in this example 'test'

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

How to pass a variable instead of a fixed text ? i use java on eclipse platform, is there a way to read a java string o declare a xpath variable?

Thanks

A: 

Am I missing something?

XPathExpression expr = xpath.compile(myVariable);

Where myVariable is a String.

Oded
+1  A: 

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!

Brabster
Thank a lot !!!
Lollo
A: 

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);
Dimitre Novatchev