如何从XML Request读取值并使用Groovy写入XML Response?

时间:2015-10-29 10:13:58

标签: xml groovy soapui

我正在研究一个groovy脚本,我必须从请求XML文件中获取值并将其写入XML响应文件。

我知道如何从普通XML中读取值,如下所示:

def text = '''
<list>
    <technology>
        <name>Groovy</name>
    </technology>
</list>
'''

def list = new XmlParser().parseText(text) 
println list.technology.name.text()

我可以使用上面的语法轻松访问节点。但在我的情况下,请求文件有&#39; keyword:label&#39;句法。考虑下面提到的货币转换器请求文件:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
<soap:Header/>
<soap:Body>
  <web:ConversionRate>
     <web:FromCurrency>USD</web:FromCurrency>
     <web:ToCurrency>INR</web:ToCurrency>
  </web:ConversionRate>
</soap:Body>
</soap:Envelope>

在这种情况下如何阅读FromCurrency的值?而不是使用XMLParser,还有其他任何有效和好的方法来处理更大的XML文件吗?

此外,在我写的响应中写入值时,通过在脚本中创建多个变量并使用语法&#34; $ {var_name}来响应它们的值。

如果我想将许多值(假设为20+)从请求写入响应,那么单个写入的变量不是好方法。那么有什么好的和有效的方法吗?

3 个答案:

答案 0 :(得分:3)

您可以这样FromCurrency(使用XmlSlurper):

def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
<soap:Header/>
<soap:Body>
  <web:ConversionRate>
     <web:FromCurrency>USD</web:FromCurrency>
     <web:ToCurrency>INR</web:ToCurrency>
  </web:ConversionRate>
</soap:Body>
</soap:Envelope>'''

def list = new XmlSlurper().parseText(text) 
println list.Body.ConversionRate.FromCurrency.text()

不确定我理解你的其余问题

答案 1 :(得分:1)

使用XmlParser,您必须在字符串中明确使用名称空间或声明它们:

import groovy.xml.*

def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
<soap:Header/>
<soap:Body>
  <web:ConversionRate>
     <web:FromCurrency>USD</web:FromCurrency>
     <web:ToCurrency>INR</web:ToCurrency>
  </web:ConversionRate>
</soap:Body>
</soap:Envelope>'''

def s = new Namespace('http://www.w3.org/2003/05/soap-envelope', 'soap')
def w = new Namespace('http://www.webserviceX.NET/', 'web')
def parsed = new XmlParser().parseText(text) 

assert 'USD' == parsed.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()
assert '' == parsed.Body.ConversionRate.FromCurrency.text()
assert 'USD' == parsed[s.Body][w.ConversionRate][w.FromCurrency].text()

如果未声明XmlSlurper名称空间,则会被忽略:

def slurped = new XmlSlurper().parseText(text)
assert 'USD' == slurped.Body.ConversionRate.FromCurrency.text()
assert '' == slurped.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()

slurped = new XmlSlurper().parseText(text).declareNamespace([soap: 'http://www.w3.org/2003/05/soap-envelope', web: 'http://www.webserviceX.NET/'])
assert 'USD' == slurped.Body.ConversionRate.FromCurrency.text()
assert 'USD' == slurped.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text()

答案 2 :(得分:1)

要使用XMLParser代替XmlSlurper(我更喜欢使用slurper):

def text = '''<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://www.webserviceX.NET/">
<soap:Header/>
<soap:Body>
  <web:ConversionRate>
     <web:FromCurrency>USD</web:FromCurrency>
     <web:ToCurrency>INR</web:ToCurrency>
  </web:ConversionRate>
</soap:Body>
</soap:Envelope>'''

def list = new XmlParser().parseText(text) 
log.info list.'soap:Body'.'web:ConversionRate'.'web:FromCurrency'.text() // prints Thu Oct 29 12:27:31 CET 2015:INFO:USD

然后在请求中添加多个属性并在脚本中逐个设置,如果您想要一种替代方法,可以构建完整的xml并使用以下方法直接设置testStep的request属性:

def text = '''<myNewRequest><someField1/><someField2/></myNewRequest>'''
def request = new XmlParser(true,true).parseText(text) 
request.someField1[0].setValue('my new value')
request.someField2[0].setValue('another value')

// converts the xml to string
StringWriter sw = new StringWriter()
new XmlNodePrinter(new PrintWriter(sw)).print(request)
def modifiedRequest = sw.toString()
// get the testStep and set the request
context.testCase.getTestStepByName('SOAP Request').setPropertyValue('request',modifiedRequest)

希望它有所帮助,