2010-07-03 11 views
12

Tengo una expresión XPath que busca un valor estático. En este ejemplo, "prueba" es ese valor:Enviando XPath una variable de Java

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

¿Cómo puedo pasar una variable en lugar de una cadena fija? Yo uso Java con Eclipse. ¿Hay alguna manera de utilizar el valor de Java String para declarar una variable XPath?

Respuesta

17

Se puede definir una resolución variable y tener la evaluación de las variables de la expresión resolver como $myvar, por ejemplo:

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

Hay una bastante buena explicación here. En realidad, no he hecho esto antes de mí mismo, así que podría probarlo y dar un ejemplo más completo.


Actualización:

Dada esta una oportunidad, trabaja un convite. Para un ejemplo de una implementación muy sencilla, se podría definir una clase que devuelve el valor de una variable dada de un mapa, así:

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

Ahora, declarar e inicializar una instancia de esta resolución en el programa, por ejemplo

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

Entonces, durante la evaluación de la expresión XPath XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");, la variable $myVar será reemplazado por la cadena text.

¡Buena pregunta, aprendí algo útil!

0

No necesita evaluar Java (o cualquier otra variable PL en XPath). En C# (no sé bien de Java) Voy a usar:

string XPathExpression = 
"//doc[contains(., " + myVar.ToString() + ")]/*/text()"; 

    XmlNodelist result = xmlDoc.SelectNodes(XPathExpression); 
+1

me parece procesos en línea sencilla de variables un poco engorroso, en comparación con la posibilidad de utilizar las variables reales. Además, tendrá que pensar en la integridad sintáctica (por ejemplo, ¿qué pasa si 'myVar' contiene comillas? Etc.) –

0

Aparte de esto answer here, que explica bien cómo hacerlo con la API estándar de Java, también se puede utilizar una biblioteca de terceros, como jOOX que puede manejar las variables de una manera sencilla:

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