2013-08-22 3 views
6

Ho una richiesta che accetta gli elementi 1..n da aggiungere al carrello. la richiesta di default ha un elemento "item" con alcuni elementi figlio, voglio aggiungere N no di elementi con elemento figlio sono in grado di aggiungere elemento elemento Item usando creaeElementNS ora voglio aggiungere elementi figlio a "elemento" come segue, può qualcuno far luce su questo script GroovyCome aggiungere gli elementi figlio dinamicamente alla richiesta SOAP in SOAPUI utilizzando lo script groovy

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

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

corrente di uscita

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

uscita desiderata

<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: sto usando l'opzione soapUI e TestCase, c'è un passo GroovyScript prima di aggiungere richiesta cestino passo, di script Groovy prepara aggiungere richiesta cestino prima di inviare richiesta, ad esempio se il mio testcase menziona 1 elemento che dovrebbe richiedere con un elemento predefinito quindi non ho problemi ad aggiungere un altro elemento Item, ma quando il mio testcase dice 2 elementi devo creare elementi secondo elemento (insieme a elementi figlio) e preparare la richiesta di aggiungere il cestino usando lo script groovy passo prima di inviare effettivamente la richiesta del carrello aggiuntivo

risposta

4

Non sono sicuro se funzionerà (io non uso SoapUI), ma fa questo aiuto?

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

Grazie per la risposta, ha avuto un rapido sguardo ottenuto (comunque proverò ancora alcune opzioni) groovy.lang.MissingMethodException: Nessuna firma del metodo: org.apache.xmlbeans.impl.store.Xobj $ ElementXobj.insertBefore() è applicabile per tipi di argomenti: (groovy.util.Node, org.apache.xmlbeans.impl.store.Xobj $ ElementXobj) – StaleElementException

+0

@StaleElementException Destra, trovato [un'altra pagina che mostra una possibile soluzione] (http://techdiary.bitourea.com/2013 /06/soapui-inserting-external-xml-node.html), e ho aggiornato la mia risposta ... Incrocio le dita ;-) –

+0

quasi lavorando di fronte a problemi con gli spazi dei nomi, sto cercando di risolverli, grazie per l'aiuto – StaleElementException

0

Check out Scott Il post di Davis su creating XML with groovy

Ho usato MarkupBuilder per creare un XML che assomiglia esattamente a quello che vuoi.

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 

output che ho ottenuto:

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

risposta aggiornati come una parte del XML già esistente e nodi solo essere aggiunto alla radice.

Prova questo codice ...

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

grazie per la risposta, ho curato la mia domanda speranza che capisce la mia richiesta, Im non preparare tutta la richiesta XML voglio solo inserire nella richiesta – StaleElementException

+0

esistente cosa fa il tuo XML originale assomiglia? –