在java中动态地为xpath表达式赋值

时间:2014-01-19 16:43:23

标签: java xpath wsdl

我正在尝试使用java从WSDL文件动态创建gui。 我需要检索与每个操作相关的消息。 为此,我需要动态分配XPath表达式值。 我将表达式分配如下

  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());

这里oper [i]是包含操作名列表的数组。 但是当我在msglist中打印节点数时它始终显示为0时无效。 我的WSDL文件包含2个操作元素的子元素。 任何人都可以帮助?? 提前致谢

2 个答案:

答案 0 :(得分:1)

从评论中,模式是:

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

缺少匹配字符串周围的引号。它应该是:

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

所以你的模式应该是:

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

使用MessageFormatString.format

可能会更清楚
String expression=String.format("/definitions/portType/operation[@name=\"%s\"]/*", oper[i]);

答案 1 :(得分:1)

您的错误是缺少的引号。但是,您应该尝试避免通过字符串连接构造XPath表达式,至少有三个原因:

  • 像你制作的那样容易出错

  • 存在严重的危险,让自己对代码注入攻击持开放态度

  • 效果

相反,利用XPath表达式可以包含变量引用的事实:

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

并且可以在执行表达式时将值绑定到变量。用于此的JAXP机制(定义VariableResolver)并不是特别优雅,但它很容易使用。