我正在研究一个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+)从请求写入响应,那么单个写入的变量不是好方法。那么有什么好的和有效的方法吗?
答案 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)
希望它有所帮助,