首页 > 解决方案 > SoapUI/Groovy - 如何在同一个 dom 中复制具有新名称的节点?

问题描述

我正在尝试从 SoapUI 响应中获取一些数据以生成新的 SoapUI 请求。这是我输入的回复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetDataResponse>
      <return>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType2>
          <date1>2018-01-30T00:00:00.000+01:00</date1>
          <img>...</img>
        </dataType2>
        <dataType2>
          <date1>2018-01-30T00:00:00.000+01:00</date1>
          <img>...</img>
        </dataType2>
        <dataType3>
        </dataType3>
      </return>
    </GetDataResponse>
  </soap:Body>
</soap:Envelope>

我试图生成的输出是:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <process>
      <workflow1>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType1>
          <img>...</img>
        </dataType1>
        <dataType2>
          <date1>2018-01-30T00:00:00.000+01:00</date1>
          <date2>2018-01-30T00:00:00.000+01:00</date2>
          <img>...</img>
        </dataType2>
        <dataType2>
          <date1>2018-01-30T00:00:00.000+01:00</date1>
          <date2>2018-01-30T00:00:00.000+01:00</date2>
          <img>...</img>
        </dataType2>
        <otherFields>
          <field/>
          <field/>
          <field/>
        </otherFields>
      </process>
    </workflow1>    
  </soap:Body>
</soap:Envelope>

使用 SoapUI groovy 脚本,我可以使用以下代码从对请求的响应中复制我想要的数据:

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def responseHolder = groovyUtils.getXmlHolder( "Step1#Response" )
def requestHolder = groovyUtils.getXmlHolder( "Step2#Request" )

// Remove all dataType1 from the request dom
for( item in requestHolder.getDomNodes( "//process/workflow1/dataType1" )){
  requestHolder.removeDomNodes("//"+item.nodeName)
}
// Remove all dataType2 from the request dom
for( item in requestHolder.getDomNodes( "//process/workflow1/dataType2" )){
  requestHolder.removeDomNodes("//"+item.nodeName)
}

def parentNode = requestHolder.getDomNode("//process/workflow1")
def otherFields = requestHolder.getDomNode("//process/workflow1/otherFields")
// Copy dataType1 into the request dom
for( item in responseHolder.getDomNodes( "//return/dataType1" )){
  def newNode = parentNode.getOwnerDocument().importNode(item,true)
  parentNode.insertBefore(newNode,otherFields)
}
// Copy dataType2 into the request dom
for( item in responseHolder.getDomNodes( "//return/dataType2" )){
  def newNode = parentNode.getOwnerDocument().importNode(item,true)
  parentNode.insertBefore(newNode,otherFields)
}

for( item in requestHolder.getDomNodes( "//process/workflow1/dataType2" )){
  // Copy //process/workflow1/dataType2/date1 to //process/workflow1/dataType2/date2
}


// Update the request
requestHolder.updateProperty()
context.requestContent = requestHolder.xml

但是现在,我想将 dataType2.date1 复制到一个名为 dataType2.date2 的新节点,但我无法做到。我不知道如何在 date1 之后复制和插入这个新节点。我尝试使用 item 来获取子节点,但我尝试的每个函数都没有定义或者我使用的对象不是好的对象......

有什么帮助吗?

标签: javascriptxmldomgroovysoapui

解决方案


推荐阅读