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

在java中为xpath表达式动态赋值,java,xpath,wsdl,Java,Xpath,Wsdl,我正在尝试使用java从WSDL文件动态创建gui。 我需要检索与每个操作相关的消息。 为此,我需要动态地分配XPath表达式值。 我将表达式赋值如下 String expression="/definitions/portType/operation[@name="+oper[i]+"]/*"; NodeList msglist= (NodeList)xpath.expressionxpath.compile(expression1).evaluate(doc,XPathCons

我正在尝试使用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个子元素。 有人能帮我吗??
提前感谢

从评论中,模式是:

/definitions/portType/opeation[@name=sayHello]/*
缺少匹配字符串周围的引号。应该是:

/definitions/portType/opeation[@name="sayHello"]/*
String expression="/definitions/portType/operation[@name=\""+oper[i]+"\"]/*";
因此,您的模式应该是:

/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]);

您的错误是缺少引号。但是,至少出于三个原因,您应该尽量避免通过字符串串联来构造XPath表达式:

  • 很容易犯你犯的那种错误

  • 让自己暴露在代码注入攻击面前是一种严重的危险

  • 演出

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

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

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

您的XPath表达式可以完成这项工作吗;你检查过了吗?尝试在concat之后打印表达式并进行检查-在我看来,表达式中缺少引号。是的,我检查了它,它正在打印所需的结果。您可以发布生成的表达式吗?当我尝试计算表达式时,msglist不包含任何内容。我不知道有什么问题它?/definitions/portType/operation[@name=sayHello]/*它正在工作!!非常感谢你