У меня есть выражение XPath, которое ищет статическое значение. В этом примере "тест" то, что значение:
XPathExpression expr = xpath.compile("//doc[contains(., 'test')]/*/text()");
Как я могу передать переменную вместо фиксированной строки? Я использую Java с Eclipse. Есть ли способ использовать значение Java String
объявить переменную XPath?
Вы можете определить преобразователь переменных и получить оценку переменных разрешения выражений, таких как $ myvar
, например:
XPathExpression expr = xpath.compile (" // doc [contains (., $ myVar)] / * / text () ");
Здесь есть довольно хорошее объяснение . Я на самом деле не делал этого раньше, поэтому я мог бы попытаться представить более полный пример.
Обновление:
Учитывая это, работает удовольствие.В качестве примера очень простой реализации вы можете определить класс, который возвращает значение для данной переменной из карты, например:
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);
}
}
Теперь объявите и инициализируйте экземпляр этого преобразователя в программе, например
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
.
Хороший вопрос, я сам узнал кое-что полезное!
Вам не нужно оценивать Java (или любые другие переменные PL в XPath). В C # (плохо знаю Java) я буду использовать:
string XPathExpression =
"//doc[contains(., " + myVar.ToString() + ")]/*/text()";
XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);