2013-08-22 91 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是什么样子? –

相关问题