Подтвердить что ты не робот

Отправка XPath переменной из Java

У меня есть выражение XPath, которое ищет статическое значение. В этом примере "test" - это значение:

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

Как передать переменную вместо фиксированной строки? Я использую Java с Eclipse. Есть ли способ использовать значение Java String для объявления переменной XPath?

4b9b3361

Ответ 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.

Хороший вопрос, я сам чему-то научился!

Ответ 2

Вам не нужно оценивать Java (или любые другие PL-переменные в XPath). В С# (хорошо не знаю Java) я буду использовать:

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

    XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);

Ответ 3

Помимо этого ответьте здесь, который объясняет, как это сделать со стандартным API Java, вы также можете использовать стороннюю библиотеку, например jOOX, который может обрабатывать переменные простым способом:

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