【问题标题】:SoapUI/Groovy - How to copy a node?SoapUI/Groovy - 如何复制节点?
【发布时间】: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>

我只需要每个&lt;b&gt;&lt;bb&gt; 复制到&lt;bb2&gt;

<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

【问题讨论】:

标签: groovy soapui


【解决方案1】:
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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多