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>