Как динамически добавлять дочерние элементы в 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 )