【发布时间】:2018-05-17 20:38:18
【问题描述】:
我只想在 SoapUI 中使用 groovy 脚本来复制一个简单的节点并重命名它。但我不知道该怎么做。
输入的xml是这样的:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<a>
<aa>...</aa>
</a>
<b>
<bb>...</bb>
</b>
<b>
<bb>..</bb>
</b>
</soap:Body>
我只需要每个<b> 将<bb> 复制到<bb2> :
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<a>
<aa>...</aa>
</a>
<b>
<bb>...</bb>
<bb2>...</bb2>
</b>
<b>
<bb>..</bb>
<bb2>...</bb2>
</b>
</soap:Body>
因为有多个“b”字段,所以我不能将属性传输与 XPath 转换一起使用,所以我需要使用 groovy 脚本,但我没有找到任何关于该特定目的的帮助。
有人可以给我一些提示吗?
我已尝试使用 daggett 答案,但我的输入是 SoapUI 请求/响应。
def requestHolder = groovyUtils.getXmlHolder( "WSCall#Request" )
def xclone(Node n){
return new XmlParser().parseText(XmlUtil.serialize(n))
}
for( item in requestHolder.getDomNodes( "//b" )){
item.depthFirst().each{e->
if(e.name()=='bb'){
def e2 = xclone(e)
e2.name = 'bb2'
e.parent()?.append( e2 )
}
}
}
但我获得了groovy.lang.MissingMethodException: No signature of method: org.apache.xmlbeans.impl.store.Xobj$ElementXobj.depthFirst() is applicable for argument types: () values: [] error at line: 34
与
requestHolder.getDomNodes( "//b" ).each{e->
if(e.name()=='bb'){
def e2 = xclone(e)
e2.name = 'bb2'
e.parent()?.append( e2 )
}
}
我得到一个groovy.lang.GroovyRuntimeException: Cannot read write-only property: name
【问题讨论】:
-
requestHolder.getDomNodes返回 DOM Nodes 和 groovy 节点不同。所以你必须检查相应的文档