6

我有一个接受 1..n 项添加到购物篮的请求。默认请求有一个带有一些子元素的“item”元素,我想添加 N 个带有子元素的项目我可以使用 creaeElementNS 添加 Item 父元素现在我想将子元素添加到“item”,如下所示,可以有人对此有所了解

<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和TestCase选项,在添加篮子请求步骤之前有一个GroovyScript步骤,groovy脚本在实际发送请求之前准备添加篮子请求,例如,如果我的测试用例提到1个项目,它应该使用默认的一个项目请求所以我不用担心添加另一个 Item 元素,但是当我的测试用例说 2 个项目时,我必须创建第二个 Items 元素(以及子元素)并在实际发送添加篮子请求之前使用 groovy 脚本步骤准备添加篮子请求

4

2 回答 2

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()
于 2013-08-22T14:03:20.740 回答
0

查看 Scott Davis 关于使用 groovy 创建 XML的文章

我使用 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 )
于 2013-08-22T13:40:08.267 回答