2014-01-19 2 views
0

Я пытаюсь создать gui динамически из файла WSDL с помощью java. Мне нужно получить сообщения, связанные с каждой операцией. Для этого мне нужно назначить значение выражения XPath динамически. Поручаю выражение следующимДинамически присваивать значение выражению xpath в java

String expression="/definitions/portType/operation[@name="+oper[i]+"]/*"; 
    NodeList msglist= (NodeList)xpath.expressionxpath.compile(expression1).evaluate(doc,XPathConstants.NODESET); 
    System.out.println("The Number of messages are"+msglist.getLength()); 

Здесь Опер [I] является массив, содержащий список имен операций. Но он не работает, когда я печатаю количество узлов в msglist, который он всегда отображает 0. Мой файл WSDL содержит 2 дочерних элемента для элемента управления. Кто-нибудь может помочь? Заранее спасибо

+0

Выполняет ли ваше выражение XPath работу; вы проверили? Попробуйте распечатать выражение после concat и проверив его - похоже, что вам не хватает кавычек в выражении для меня. –

+0

Да, я проверил, что он работает, он печатает желаемый результат. – user3172659

+0

Не могли бы вы опубликовать сгенерированное выражение? –

ответ

1

Из комментариев, картина:

/definitions/portType/opeation[@name=sayHello]/* 

Котировки вокруг строки матча отсутствует. Оно должно быть:

/definitions/portType/opeation[@name="sayHello"]/* 

Так что ваш шаблон должен быть:

String expression="/definitions/portType/operation[@name=\""+oper[i]+"\"]/*"; 

Это может быть понятнее использовать MessageFormat или String.format:

String expression=String.format("/definitions/portType/operation[@name=\"%s\"]/*", oper[i]); 
+0

Его работа !! Спасибо тебе большое – user3172659

1

Ваша ошибка недостающие кавычки. Тем не менее, вы должны стараться избегать построения XPath выражений с помощью конкатенации строк, по крайней мере по трем причинам:

  • Это легко сделать ошибки, как тот, который вы сделали

  • Там очень серьезная опасность того, чтобы оставить себя открытым для атак внедрения кода

  • Performance

Вместо этого воспользоваться тем фактом, что XPat h выражения могут содержать переменные ссылки:

String expression="/definitions/portType/operation[@name=$param]/*"; 

и что вы можете привязать значение к переменной при выполнении выражения. Механизм JAXP для этого (определение VariableResolver) не особенно элегантен, но его достаточно просто использовать.

Смежные вопросы