SoapUI属性传输和xpath / xquery数字格式

时间:2011-06-15 16:02:40

标签: xpath formatting xquery soapui

我在SoapUI中有这个属性转移:

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
//soapEnv:Body/LoginResponse/baseSequenceId

然后让它返回 123456 。但我想要 123457 (我得到+1)

我试过了:

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
//soapEnv:Body/LoginResponse/baseSequenceId + 1

但结果是 123457.0 。我尝试了一些我发现的重新格式化方法,但很可能我没有以正确的方式使用它们。我对这个东西很新。

我也试过这个(用xquery):

declare namespace soapEnv="http://schemas.xmlsoap.org/soap/envelope/";
let $x := //soapEnv:Body/LoginResponse/baseSequenceId
return $x

$ x 尝试了几件事,但我尝试的所有内容都以null或InvocationTargetException结束。

感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

非常感谢你的建议,虽然我无法让它们发挥作用:(
也许我的SoapUI有问题,因为所有xpath函数都返回null ..

我使用了groovy:

groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )

loginResponse = groovyUtils.getXmlHolder("Login#Response")
loginResponse.declareNamespace( "soapEnv", "http://schemas.xmlsoap.org/soap/envelope/" )
sessionIdStr = loginResponse.getNodeValue( "//soapEnv:Body/LoginResponse/sessionId" )
baseSequenceIdStr = loginResponse.getNodeValue( "//soapEnv:Body/LoginResponse/baseSequenceId" )
sequenceIdStr = (baseSequenceIdStr.toInteger() + 1).toString()

createRequest = groovyUtils.getXmlHolder("Create#Request")
createRequest.declareNamespace( "soapEnv", "http://schemas.xmlsoap.org/soap/envelope/" )
createRequest.setNodeValue( "//soapEnv:Header/SessionId", sessionIdStr )
createRequest.setNodeValue( "//soapEnv:Header/TransactionId", baseSequenceIdStr )
createRequest.setNodeValue( "//soapEnv:Header/SequenceId", sequenceIdStr )
createRequest.updateProperty()

答案 1 :(得分:1)

请注意,如果//soapEnv:Body/LoginResponse/baseSequenceId + 1的值为整数,则在将其转换为字符串时为XPath should not put in a decimal point

但也许在这种情况下XPath返回一个数字,而SoapUI将它转换为字符串,并使用小数点。

我首先尝试(已更新)

string(//soapEnv:Body/LoginResponse/baseSequenceId + 1)

这是为了强制转换为字符串在XPath中发生,因此SoapUI没有机会用数值做任何有趣的事情。

或者,您可以尝试

floor(//soapEnv:Body/LoginResponse/baseSequenceId + 1)

甚至

string(floor(...))

如果这不起作用,您可以尝试

substring-before(//soapEnv:Body/LoginResponse/baseSequenceId + 1, '.')

它不是很优雅,但它可能有效。