Как динамически добавлять дочерние элементы в запрос SOAP в SOAPUI с помощью groovy script

У меня есть запрос, который принимает элементы 1..n для добавления в корзину. запрос по умолчанию имеет один элемент "item" с некоторыми дочерними элементами, я хочу добавить N no элементов с дочерним элементом. Я могу добавить элемент Item parent, используя creaeElementNS. Теперь я хочу добавить дочерние элементы в "item", как показано ниже, может кто-то пролил свет на этот

<basket:item>
<basket:itemid>222</basket:itemid>
<basket:itemcode>DEF</basket:itemcode>
</basket:item>

Groovy script

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( "createBasket#Request" )
def parentnode = holder.getDomNode( "//basket:createBasketRequest" )
def basketTotal= holder.getDomNode( "//basket:itemsTotal" ) 
def itemsTag = requestDoc.createElementNS(parentnode.getNamespaceURI(), "item")
parentnode.insertBefore(itemsTag , basketTotal)
holder.updateProperty()

Токовый выход

<basket:createbasketrequest>
<basket:item>
 <basket:itemid>111</basket:itemid>
 <basket:itemcode>ABC</basket:itemcode>
</basket:item>

 <basket:itemstotal>500.00</basket:itemstotal>
</basket:createbasketrequest>

Желаемый выход

<basket:createbasketrequest>
 <basket:item>
 <basket:itemid>111</basket:itemid>
 <basket:itemcode>ABC</basket:itemcode>
 </basket:item>
 <basket:item>
 <basket:itemid>222</basket:itemid>
 <basket:itemcode>DEF</basket:itemcode>
 <basket:item>
 <basket:itemstotal>500.00</basket:itemstotal>
</basket:item></basket:item></basket:createbasketrequest>

EDIT: я использую параметр soapUI и TestCase, перед шагом добавления корзины требуется шаг GroovyScript, groovy script готовит запрос корзины перед отправкой запроса, например, если в моем тестовом документе указано 1 элемент, он должен запросите по умолчанию один элемент, поэтому мне не нужно беспокоиться о добавлении других элементов Item, но когда мой тестовый файл говорит, что у меня два элемента, мне нужно создать элементы Second Items (вместе с дочерними элементами) и подготовить запрос корзины добавления с помощью groovy script. на самом деле отправка запроса корзины

2 ответа

Не уверен, что он будет работать (я не использую SoapUI), но помогает ли это?

def groovyUtils = new com.eviware.soapui.support.GroovyUtils( context )
def holder = groovyUtils.getXmlHolder( "createBasket#Request" )
def parentnode = holder.getDomNode( "//basket:createBasketRequest" )
def basketTotal = holder.getDomNode( "//basket:itemsTotal" ) 
def nodeText = '''<basket:item>
 | <basket:itemid>222</basket:itemid>
 | <basket:itemcode>DEF</basket:itemcode>
 |</basket:item>'''.stripMargin()
def nodeHolder = new com.eviware.soapui.support.XmlHolder( nodeText )
def nodeItem = nodeHolder.getDomNode( "//basket:item" )
def importNode = requestDoc.importNode( nodeItem, true )
parentnode.insertBefore( importNode, basketTotal )
holder.updateProperty()


Отправляйте сообщение Скотта Дэвиса на создание XML с groovy

Я использовал MarkupBuilder для создания XML, который выглядит точно так, как вы хотите.

def sw = new StringWriter()
def xml = new groovy.xml.MarkupBuilder(sw)
xml."basket:createBasketRequest"(){
 "basket:item"(){
 "basket.itemId"("111")
 "basket:itemCode"("ABC")
 }
 "basket:item"(){
 "basket.itemId"("222")
 "basket:itemCode"("DEF")
 }
 "basket:itemsTotal"("500.00")
}
log.info sw

Выход я получил:

<basket:createbasketrequest>
 <basket:item>
 <basket.itemid>111</basket.itemid>
 <basket:itemcode>ABC</basket:itemcode>
 </basket:item>
 <basket:item>
 <basket.itemid>222</basket.itemid>
 <basket:itemcode>DEF</basket:itemcode>
 </basket:item>
 <basket:itemstotal>500.00</basket:itemstotal>
</basket:createbasketrequest>

Обновление ответа, поскольку некоторая часть XML уже существует, и узлы просто должны быть добавлены к корню.

Попробуйте этот код...

import org.custommonkey.xmlunit.Diff
import org.custommonkey.xmlunit.XMLUnit
import groovy.xml.StreamingMarkupBuilder
def root = new XmlSlurper().parseText(orgXML)
root.appendNode {
 "basket:item"{
 "basket:itemID"("222")
 "basket:itemCode"("DEF")
 }
}
log.info groovy.xml.XmlUtil.serialize( root )

licensed under cc by-sa 3.0 with attribution.