2013-08-22 12 views
6

Mam żądanie, które akceptuje pozycje 1.numeru do dodania do koszyka. domyślne żądanie ma jeden element "element" z niektórymi elementami podrzędnymi, chcę dodać N żadnych elementów z elementem podrzędnym mogę dodać element nadrzędny elementu za pomocą creaeElementNS teraz chcę dodać elementy potomne do "elementu" jak na przykład, może ktoś rzucić nieco światła na tenJak dynamicznie dodawać elementy potomne do żądania SOAP w SOAPUI przy użyciu groovy skryptu

<basket:item> 
<basket:itemId>222</basket:itemId> 
<basket:itemCode>DEF</basket:itemCode> 
<basket:item> 

Groovy skryptu

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() 

Prąd wyjścia

<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> 

pożądany wynik

<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> 

EDIT: używam opcji SoapUI i TestCase, nie jest krokiem GroovyScript przed dodać kosz krok żądanie, Groovy skrypt przygotowuje dodać prośbę kosz zanim faktycznie wysyłania żądania, na przykład jeśli mój testcase wspomina o 1 pozycji, której powinien zażądać z domyślnym jednym elementem, więc nie martwię się, aby dodać kolejne elementy Elementów, ale gdy mój egzemplarz testowy mówi o 2 elementach, muszę utworzyć drugie elementy Items (wraz z elementami potomnymi) i przygotować żądanie dodania koszyka za pomocą groovy script krok przed wysłaniem prośby o dodanie koszyka

Odpowiedz

4

Nie wiem, czy to będzie działać (nie używam SoapUI), ale czy to pomoże?

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() 
+0

Dzięki za odpowiedź, szybko się obejrzałem (mimo to spróbuję więcej opcji) groovy.lang.MissingMethodException: Brak sygnatury metody: org.apache.xmlbeans.impl.store.Xobj $ ElementXobj.insertBefore() dotyczy typy argumentów: (groovy.util.Node, org.apache.xmlbeans.impl.store.Xobj $ ElementXobj) – StaleElementException

+0

@StaleElementException Prawda, znaleziono [kolejną stronę przedstawiającą możliwe rozwiązanie] (http://techdiary.bitourea.com/2013 /06/soapui-inserting-external-xml-node.html) i zaktualizowałem moją odpowiedź ... Fingers crossed ;-) –

+0

prawie pracuję po prostu w obliczu problemu z przestrzeniami nazw, próbuję je rozwiązać, dzięki za pomoc – StaleElementException

0

Zobacz Scott Stanowisko Davisa na creating XML with groovy

Użyłem MarkupBuilder do stworzenia XML, który wygląda dokładnie tak, jak chcesz.

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 

Wyjście mam:

<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> 

odpowiedź Aktualizacja jako jakiejś części XML już istnieje i węzły po prostu muszą być dołączone do korzenia.

Spróbuj tego kodu ...

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) 
+0

dzięki za odpowiedź, mam edytowany moje pytanie nadzieję, że rozumie moje wymagania, Im nie przygotowuje cały wniosek XML po prostu chcę wstawić w istniejące żądanie – StaleElementException

+0

Co oryginalny XML wyglądać? –

Powiązane problemy