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

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

<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:item>
</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:createBasketRequest>

редактировать: я с помощью soapUI и TestCase вариант, есть GroovyScript шаг, прежде чем добавить корзину запросу шаг, Groovy-скрипт подготавливает добавить корзину просьба перед отправкой запроса, например, если мой пример упоминает пункт 1 следует запрос по умолчанию элемент, поэтому у меня нет никаких забот, чтобы добавить еще один элемент, элементами, но для моего теста говорит 2 вещи я должен создать второго элементов(вместе с дочерними элементами) и подготовить добавить корзину запросу с помощью groovy скрипт шаг перед отправкой запроса добавить корзину

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 )