2015-04-02 72 views
1

我试图通过添加具有不同的值重复子节点修改SOAP请求。SOAPUI:修改请求:Groovy:在appendNode适用参数

这是我到目前为止有:

请求:

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "..."> 
    <soapenv:Body> 
     <ns2:OperationName> 
      <ns3:CuteN>77777</ns3:CuteN> 
      <ns3:RaveN>666</ns3:RaveN> 
     </ns2:OperationName> 
    </soapenv:Body> 
</soapenv:Envelope> 

请求修改为:(填写XML标记&添加另一个标签<RaveN></RaveN>一个值)

<soapenv:Envelope xlmns:ns1 = "..." xlmns:ns2 = "..." xlmns:ns3 = "..." xlmns:ns4 = "..."> 
    <soapenv:Body> 
     <ns2:OperationName> 
      <ns3:CuteN>77777</ns3:CuteN> 
      <ns3:RaveN>666</ns3:RaveN> 
      <ns3:RaveN>888</ns3:RaveN> 
     </ns2:OperationName> 
    </soapenv:Body> 
</soapenv:Envelope> 
使用

代码:

/* Groovy Utilities Declaration */ 
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context) 

/* Request Holder Setup */ 
def request  = context.expand('${RequestStepName#Request}') 
def requestHolder = groovyUtils.getXmlHolder("request") 

/* Declaring Namespaces */ 
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/" 
requestHolder.namespaces["ns2"]  = "..." 
requestHolder.namespaces["ns3"]  = "..." 
requestHolder.namespaces["ns4"]  = "..." 

/* Set few string names */ 
def soapEnvXString  = "//soapenv:Envelope" 
def soapBodyXString  = "/soapenv:Body" 
def operXString   = "/ns2:OperationName" 
def raveNumXString  = "/ns3:RaveNum" 

/* create object of Request nodes */ 
def parentNode  = requestHolder.getDomNode(soapEnvXString + soapBodyXString + operXString) 

def reqRaveNumTwo = "888" 

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""") 
    parentNode.appendNode(secondRaveNumNode) 
} 

/* Update the request holder properties */ 
requestHolder.updateProperty(true) 

错误:

groovy.lang.MissingMethodException: No signature of method: org.apache.xmlbeans.impl.store.Xobj$ElementXobj.appendNode() is applicable for argument types: (groovy.util.slurpersupport.NodeChild) values: [888] 

我知道我失去了一些东西,这是我的Groovy深潜的第3天。任何帮助将不胜感激,提前致谢!

+0

此问题已通过@Albciff回答。有报道说,我对上面的代码做得到它的实际工作一些变化。更新后的代码如下。 – ssc 2015-04-06 15:49:52

回答

0

我觉得在你的代码的两个问题,第一你已经使用appendChild方法,因为你想添加一个子你<ns2:OperationName>节点内(不appendNode方法,它在你的对象不存在),第二个问题是,你混合XmlSlurper类与XmlBeans,因为你不能在“节点”从一个引擎添加到一个对象到另一个。

你已经改变你的if声明中的代码,以适应这些修正,所以你可以使用类似:

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def nodeHolder = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"...\">${reqRaveNumTwo}</ns3:RaveNum>") 
    def itemNode = nodeHolder.getDomNode("//ns3:RaveNum") 
    // import the node 
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false) 
    // and finally append it 
    parentNode.appendChild(secondRaveNumNode) 
} 

代替:

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def secondRaveNumNode = new XmlSlurper(false,false).parseText("""<ns3:RaveNum>${reqRaveNumTwo}</ns3:RaveNum>""") 
    parentNode.appendNode(secondRaveNumNode) 
} 

该代码使用XmlBeans创建新节点看起来不太直观但是这样它的工作原理:)

此外,我在你的代码看到这一点:def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context),我想这只是一个typo但它必须是def groovyUtils = new com.eviware.soapui.support.GroovyUtils(context)

希望这有助于

+0

非常感谢您为我指出正确的方向!现在有道理。 – ssc 2015-04-06 15:48:34

+0

@ssc很好的帮助你:) – albciff 2015-04-07 06:25:49

0

代码已更新,如下得到它的实际工作:

/* Groovy Utilities Declaration */ 
def groovyUtils = new ns4.eviware.soapui.support.GroovyUtils(context) 

/* Request Holder Setup */ 
def request  = context.expand('${RequestStepName#Request}') 
def requestHolder = groovyUtils.getXmlHolder("request") 

/* Declaring Namespaces */ 
requestHolder.namespaces["soapenv"] = "http://schemas.xmlsoap.org/soap/envelope/" 
requestHolder.namespaces["ns2"]  = "..." 
requestHolder.namespaces["ns3"]  = "..." 
requestHolder.namespaces["ns4"]  = "..." 

/* Set few string names */ 
def operXString   = "//ns2:OperationName" 
def raveNumXString  = "//ns3:RaveNum" 

/* create object of Request nodes */ 
def parentNode = requestHolder.getDomNode(operXString) 

def reqRaveNumTwo = "888" 

if(reqRaveNumTwo != null && reqRaveNumTwo != "") 
{ 
    /* create new node */ 
    def nodeHolder = groovyUtils.getXmlHolder("<ns3:RaveNum xmlns:ns3=\"ns3\">${reqRaveNumTwo}</ns3:RaveNum>") 
    def itemNode = nodeHolder.getDomNode(raveNumXString) 
    // import the node 
    def secondRaveNumNode = parentNode.getOwnerDocument().importNode(itemNode,false) 
    // and finally append it 
    parentNode.appendChild(secondRaveNumNode) 
} 

/* Update the request holder properties */ 
requestHolder.updateProperty(true) 
context.requestContent = requestHolder.xml