2013-08-22 56 views
6

我有一個接受1..n項添加到購物籃的請求。默認請求有一個「item」元素與一些子元素,我想添加N的項目與子元素我可以添加項目父元素使用creaeElementNS現在我想添加子元素「項目」就像下面,可以有人一些線索這如何使用groovy腳本動態地將SOAP元素中的子元素添加到SOAP請求中

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

Groovy腳本

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和測試用例的選擇,有一個GroovyScript步驟之前加入籃請求步驟,Groovy腳本編制實際發送請求,例如前加籃要求,如果我的測試用例提及1個項目它應該請求默認的一個項目,所以我不必擔心添加另一個項目元素,但是當我的測試用例說2個項目時,我必須創建第二個項目元素(以及子元素)並使用groovy腳本準備添加籃子請求步驟之前實際發送添加購物籃請求

回答

4

不知道是否會工作(我不使用了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() 
+0

感謝您的回覆,得到了一個快速的樣子(無論如何,我會嘗試一些更多的選擇)groovy.lang.MissingMethodException:沒有方法的簽名:org.apache.xmlbeans.impl.store.Xobj $ ElementXobj.insertBefore()適用於參數類型:(groovy.util.Node,org.apache.xmlbeans.impl.store.Xobj $ ElementXobj) – StaleElementException

+0

@StaleElementException對,找到[顯示可能的解決方案的另一頁](http://techdiary.bitourea.com/2013 /06/soapui-inserting-external-xml-node.html),並更新了我的答案...手指劃過;-) –

+0

幾乎只是面臨命名空間的問題,我試圖解決它們,感謝您的幫助 – StaleElementException

0

退房斯科特戴維斯的帖子在creating XML with 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 

輸出I得到:

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

感謝您的答覆,我已經編輯我的問題,希望瞭解我的要求,我不是準備整個XML請求我只是想在現有請求 – StaleElementException

+0

插入什麼是您的原始的XML是什麼樣子? –

相關問題