SoapUI/Groovy-如何复制节点?

SoapUI/Groovy-如何复制节点?,groovy,soapui,Groovy,Soapui,我只想在SoapUI中使用groovy脚本来复制一个简单的节点并重命名它。但我不知道该怎么做 输入xml如下所示: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <a> <aa>...</aa> </a> <a> <aa>...&l

我只想在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>
但是我得到了一个
groovy.lang.MissingMethodException:没有方法签名:org.apache.xmlbeans.impl.store.Xobj$ElementXobj.depthFirst()适用于参数类型:()值:[]第34行错误

我获得了一个
groovy.lang.GroovyRuntimeException:Cannot read-write-only属性:name

import groovy.xml.XmlUtil
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)
def root=new XmlParser().parseText(“”) ... 111 222 ''') def xclone(节点n){ 返回新的XmlParser().parseText(XmlUtil.serialize(n)) } root.depthFirst()。每个{e-> 如果(例如name()=='bb'){ def e2=xclone(e) e2.name='bb2' e、 父项()?.append(e2) } } println XmlUtil.serialize(根)
结果

<?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>

...
111
111
222
222
返回,它与groovy节点不同。因此,您必须检查相应的文档
requestHolder.getDomNodes( "//b" ).each{e->
  if(e.name()=='bb'){
    def e2 = xclone(e)
    e2.name = 'bb2'
    e.parent()?.append( e2 )
  }
}
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>