2015-10-29 84 views
0

我正在处理一个groovy脚本,在这个脚本中,我必须从请求XML文件中提取值并将其写入XML响应文件。如何从XML Request中读取值并使用Groovy写入XML Response?

我知道如何从正常XML下面给出的读取值:

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

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

我可以使用上述语法轻松访问节点。但在我的情况下,请求文件具有'keyword:label'语法。考虑下面提及的申请文件进行货币转换器:

<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文件?

另外,尽管我通过创建脚本多个变量和使用语法“$ {} VAR_NAME使用响应它们的值写入响应值写入。

如果我想写很多值(假设20+ )从请求到响应,那么对于个人写作的变量不是好办法那么,有没有这方面的任何良好和有效的方式

回答

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() 

不知道我理解你的问题的其余

+0

我该怎么办的使用XMLParser的一样吗? – Madhusudan

+2

为什么? XmlSlurper出了什么问题? –

+0

刚刚发布了一个XmlParser示例的答案,但我同意@tim_yates:XmlSlurper出了什么问题? – jalopaba

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() 
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,并设置直接使用如下方法您一步步测试的请求属性:

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) 

希望它能帮助,