SoapUI/Groovy - 如何复制节点?
SoapUI/Groovy - How to copy a node?
我只想在 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"字段,我无法使用属性 transfer with XPath tranformation,所以我需要使用groovy脚本,但我没有找到为特定目的提供帮助。
有谁能给我一些提示吗?
我已尝试使用 daggett 答案,但我的输入是 SoapUI request/response。
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
import groovy.xml.XmlUtil
def root = new XmlParser().parseText('''<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<b>
<bb>111</bb>
</b>
<b>
<bb><cc>222</cc></bb>
</b>
</soap:Body>
</soap:Envelope>''')
def xclone(Node n){
return new XmlParser().parseText(XmlUtil.serialize(n))
}
root.depthFirst().each{e->
if(e.name()=='bb'){
def e2 = xclone(e)
e2.name = 'bb2'
e.parent()?.append( e2 )
}
}
println XmlUtil.serialize(root)
结果
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<b>
<bb>111</bb>
<bb2>111</bb2>
</b>
<b>
<bb>
<cc>222</cc>
</bb>
<bb2>
<cc>222</cc>
</bb2>
</b>
</soap:Body>
</soap:Envelope>
我只想在 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"字段,我无法使用属性 transfer with XPath tranformation,所以我需要使用groovy脚本,但我没有找到为特定目的提供帮助。
有谁能给我一些提示吗?
我已尝试使用 daggett 答案,但我的输入是 SoapUI request/response。
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
import groovy.xml.XmlUtil
def root = new XmlParser().parseText('''<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<b>
<bb>111</bb>
</b>
<b>
<bb><cc>222</cc></bb>
</b>
</soap:Body>
</soap:Envelope>''')
def xclone(Node n){
return new XmlParser().parseText(XmlUtil.serialize(n))
}
root.depthFirst().each{e->
if(e.name()=='bb'){
def e2 = xclone(e)
e2.name = 'bb2'
e.parent()?.append( e2 )
}
}
println XmlUtil.serialize(root)
结果
<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<a>
<aa>...</aa>
</a>
<b>
<bb>111</bb>
<bb2>111</bb2>
</b>
<b>
<bb>
<cc>222</cc>
</bb>
<bb2>
<cc>222</cc>
</bb2>
</b>
</soap:Body>
</soap:Envelope>