javascript - 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 来获取子节点,但我尝试的每个函数都没有定义或者我使用的对象不是好的对象......
有什么帮助吗?
解决方案
推荐阅读
- google-chrome - 无法在 Docker 上安装 Google Chrome
- c# - UPDATE-DATABASE 返回 '值不能为空。参数名称:set'
- angular - 需要以角度调用外部JS文件,特别是特定页面中的js
- javascript - 在将道具从一个组件传递到另一个组件时,对象作为反应子项(找到带有键的对象)无效
- python - 基于布尔数组查找连续序列
- postgresql - "'select to_char(application_date::timestamp, '" 处或附近的语法错误
- python-2.7 - 当我一次初始化两个变量时,为什么我得到这个错误'int' object is not iterable
- ruby-on-rails - 当我尝试执行 for 循环时,没有将 Symbol 隐式转换为 Integer
- tsql - T-SQL order by 并且只取最高值
- docker - docker-desktop 安装后在 windows 10 中找不到 daemon.json 文件