2015-10-29 22 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) 

希望它能幫助,