Ответ 1
Вы можете определить переменную resolver и получить оценку переменных выражения, таких как $myvar
, например:
XPathExpression expr = xpath.compile("//doc[contains(., $myVar)]/*/text()");
Здесь есть довольно хорошее объяснение здесь. Я на самом деле не делал этого до себя, поэтому я мог бы пойти и представить более полный пример.
Update:
Учитывая это, работает. Для примера очень простой реализации вы можете определить класс, который возвращает значение для данной переменной с карты, например:
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 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
.
Хороший вопрос, я сам чему-то научился!