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

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

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

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

13
задан Pops 10 August 2012 в 20:50
поделиться

2 ответа

Вы можете определить преобразователь переменных и получить оценку переменных разрешения выражений, таких как $ 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 .

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

18
ответ дан 1 December 2019 в 23:30
поделиться

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

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

    XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);
0
ответ дан 1 December 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: