Groovy 使用SoapUI更新模拟响应中的xml

Groovy 使用SoapUI更新模拟响应中的xml,groovy,soapui,Groovy,Soapui,我使用SoapUI模拟服务,并使用groovy脚本根据请求返回不同的存储XMl import com.eviware.soapui.support.GroovyUtils import groovy.xml.XmlUtil def groovyUtils = new GroovyUtils(context) def xmlParser = new XmlParser() def responseContent def requestXmlHolder = groovyUtils.getXm

我使用SoapUI模拟服务,并使用groovy脚本根据请求返回不同的存储XMl

import com.eviware.soapui.support.GroovyUtils
import groovy.xml.XmlUtil

def groovyUtils = new GroovyUtils(context)

def xmlParser = new XmlParser()
def responseContent

def requestXmlHolder = groovyUtils.getXmlHolder(mockRequest.getRequestContent())
requestXmlHolder.declareNamespace("v01", "http://www.zoot.com/data_type/ZE_Messaging/v01")
def email = (requestXmlHolder.getNodeValue("//v01:Request[1]/v01:Email[1]"))

def responsePath = "C:/MockService/Responses"

switch(email){
    case ~/(?i).*acceptall.*/:
        responseContent = xmlParser.parse( responsePath + "/acceptall-response.xml" )
        break
    case ~/(?i).*acceptspl.*/:
        responseContent = xmlParser.parse( responsePath + "/acceptspl-response.xml" )
        break
    case ~/(?i).*acceptmpl.*/:
        responseContent = xmlParser.parse( responsePath  + "/acceptmpl-response.xml" )
        break
    case ~/(?i).*decline.*/:
        responseContent = xmlParser.parse( responsePath + "/decline-response.xml" )
        break
    default:
        responseContent = xmlParser.parse( responsePath + "/custom-response.xml" )
        break
}

context.content = XmlUtil.serialize(responseContent)
这很好,但是现在我尝试更新这个响应的一个节点,更准确地说,我想在脚本中添加当前日期,因为xml中有一个节点

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v01="http://www.whatever.com/data_type/ZE_Messaging/v01">
   <soapenv:Header/>
   <soapenv:Body>
      <v01:Response>
         <v01:RequestID>eeee</v01:RequestID>
         <v01:TransactionID>?</v01:TransactionID>
         <v01:CostumerID>?</v01:CostumerID>
         <v01:TransactionDateTime>?</v01:TransactionDateTime>
         <v01:FirstName>?</v01:FirstName>
         <v01:MiddleName>?</v01:MiddleName>
         <v01:Name>?</v01:Name>
         <v01:MaidenName>?</v01:MaidenName>
         <v01:Gender>?</v01:Gender>
         <v01:DateOfBirth>?</v01:DateOfBirth>
         <v01:Decision>ACCEPTALL</v01:Decision>
         <v01:DecisionText>?</v01:DecisionText>
         <v01:DecisionReasonCodes>?</v01:DecisionReasonCodes>
         <v01:ErrorCode>?</v01:ErrorCode>
         <v01:ErrorDescription>?</v01:ErrorDescription>
         <v01:AdditionalDetails>
            <v01:Data category="?" attribute="?">?</v01:Data>
         </v01:AdditionalDetails>
      </v01:Response>
   </soapenv:Body>
</soapenv:Envelope>
我会拿到“eeee”


因此,基本上我需要的是,在设置上下文之前,如何将其设置为与我从文件本身获得的内容不同的内容。例如,要将从设置为“eeee”的文件系统检索到的xml中的RequestID更新为“iiii”,脚本应为

def soapenv =  new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/")
def v01 = new groovy.xml.Namespace("http://www.whatever.com/data_type/ZE_Messaging/v01")

log.info responseContent[soapenv.Body][v01.Response][v01.RequestID].text()
import com.eviware.soapui.support.GroovyUtils
import groovy.xml.XmlUtil

def groovyUtils = new GroovyUtils(context)

def xmlParser = new XmlParser()
def responseContent

def requestXmlHolder = groovyUtils.getXmlHolder(mockRequest.getRequestContent())
requestXmlHolder.declareNamespace("v01", "http://www.whatever.com/data_type/ZE_Messaging/v01")
def email = (requestXmlHolder.getNodeValue("//v01:Request[1]/v01:Email[1]"))

def responsePath = "C:/inetpub/ZootMock/Responses"

switch(email){
    case ~/(?i).*acceptall.*/:
        responseContent = xmlParser.parse( responsePath + "/acceptall-response.xml" )
        break
    case ~/(?i).*acceptspl.*/:
        responseContent = xmlParser.parse( responsePath + "/acceptspl-response.xml" )
        break
    case ~/(?i).*acceptmpl.*/:
        responseContent = xmlParser.parse( responsePath  + "/acceptmpl-response.xml" )
        break
    case ~/(?i).*decline.*/:
        responseContent = xmlParser.parse( responsePath + "/decline-response.xml" )
        break
    default:
        responseContent = xmlParser.parse( responsePath + "/custom-response.xml" )
        break
}
responseContent = xmlParser.parse( responsePath + "/acceptall-response.xml" )

def soapenv =  new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/")
def v01 = new groovy.xml.Namespace("http://www.whatever.com/data_type/ZE_Messaging/v01")

responseContent[soapenv.Body][v01.Response][v01.RequestID][0].value = 'iii' 

context.content = XmlUtil.serialize(responseContent)
所以关键是

def soapenv =  new groovy.xml.Namespace("http://schemas.xmlsoap.org/soap/envelope/")
def v01 = new groovy.xml.Namespace("http://www.whatever.com/data_type/ZE_Messaging/v01")

responseContent[soapenv.Body][v01.Response][v01.RequestID][0].value = 'iii' 

谢谢

不清楚您想做什么。@Opal,我想更新我从文件系统获得的xml,并将当前日期放在TransactionDateTime中。我更新问题您能添加完整的回答吗?例如,使用名称空间,这是一个有效的XML文件?是的,@Opal,这是一个有效的XML文件,我添加到问题中