Отправка XPath переменной из Java - PullRequest
13 голосов
/ 03 июля 2010

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

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

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

Ответы [ 3 ]

18 голосов
/ 03 июля 2010

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

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

0 голосов
/ 20 января 2012

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

List<String> list = $(doc).xpath("//doc[contains(., $1)]/*", "test").texts();
0 голосов
/ 03 июля 2010

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

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

    XmlNodelist result = xmlDoc.SelectNodes(XPathExpression);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...