我正在尝试在SoapUI中构建一个模拟服务,它根据请求中传递的值动态返回响应。例如:
<foo>
<bar>
<ID>Response1</ID> <--- I want to extract this
<ReferenceID>stuff</ReferenceID>
<CreationDate>2016-05-01T11:34:56Z</CreationDate>
</bar>
</foo>
所以我将DISPATCH设置为SCRIPT并尝试以下操作(返回值应指定响应的名称,并返回):
def req = new XmlSlurper().parseText(mockRequest.requestContent)
return "${req.foo.bar.ID}"
而且:
def holder = new com.eviware.soapui.support.XmlHolder(mockRequest.requestContent )
def arg1 = holder.getNodeValue("ID") // also tried "//ID"
return arg1.toString();
两者都没有工作,模拟总是返回默认响应 - 希望你们中的一些人可以帮我解决问题:)
答案 0 :(得分:1)
问题可能是您的<foo>
响应包含在 SOAP <envelope>
和<body>
中,因此您使用{{1}的路径}不正确XmlSlurper
。
此外,如果在您的情况下,您的回复不是req.foo.bar.ID
和<envelope>
的包装,请注意<body>
XmlSlurper
节点从对象本身开始,因此{{由于root
是根节点,因此不需要1}},请查看以下示例:
req.foo
由于这个,获取节点值的简单方法是使用find
方法,所以在您的DISPATCH脚本中:
<foo>
或者,如果您想使用def xml =
'''<foo>
<bar>
<ID>Response1</ID>
<ReferenceID>stuff</ReferenceID>
<CreationDate>2016-05-01T11:34:56Z</CreationDate>
</bar>
</foo>
'''
def slurper = new XmlSlurper().parseText(xml)
println slurper.foo // prints nothing...
println slurper.bar.ID // prints Response1
代替def req = new XmlSlurper().parseText(mockRequest.requestContent)
return req.'**'.find { it.name() == 'ID' }
作为@Rao注释,只需在 XPath 上使用命名空间即可。幸运的是, SOAPUI 允许您使用XmlHolder
作为命名空间的通配符,因此XmlSlurper
更正*
:
ID
希望它有所帮助,