我正在尝试使用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个操作元素的子元素。 任何人都可以帮助?? 提前致谢
答案 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]);
答案 1 :(得分:1)
您的错误是缺少的引号。但是,您应该尝试避免通过字符串连接构造XPath表达式,至少有三个原因:
像你制作的那样容易出错
存在严重的危险,让自己对代码注入攻击持开放态度
效果
相反,利用XPath表达式可以包含变量引用的事实:
String expression="/definitions/portType/operation[@name=$param]/*";
并且可以在执行表达式时将值绑定到变量。用于此的JAXP机制(定义VariableResolver)并不是特别优雅,但它很容易使用。