2017-05-09 45 views
0

我有一段代碼,它在xml中查找名爲'ExtranetContract'的屬性,並執行斷言以檢查該屬性是否存在,並且其值等於' true'如何從xml中檢索屬性的所有實例

def DailyContracts = xml.'soap:Body' 
       .TestResponse 
       .TestContractType 
       .DailyContracts 

def ContractType = DailyContracts.findAll { [email protected] == "C"} 

def ExtranetContract = ContractType.DailyContract[0][email protected] 

assert ExtranetContract.size() > 0 && ExtranetContract.every { it == 'true' } 

注意該行:def ExtranetContract = ContractType.DailyContract[0][email protected]。該[0]代表DailyContract的第一個實例(其中接觸式等於'C'

,我不知道我是否有合同類型'C'兩個或更多的外聯網的合同,將工作(我have't了一個例子來測試自己,但我已經創建了一個虛擬的XML顯示在哪裏上面的代碼行可能無法在檢查所有外網的合同有效工作的範例屬性

<Contracts> 
<DailyContracts Type="S"> 
    <DailyContract Type="TEST" Code="xxx"> 
     <Name>Extranet</Name> 
    </DailyContract> 
    </DailyContracts> 
<DailyContracts Type="C"> 
    <DailyContract Type="TEST" Code="xxx" ExtranetContract="true"> 
    <Name>Test Hotel 1</Name> 
    </DailyContract> 
    <DailyContract Type="TEST" Code="xxx" ExtranetContract="true"> 
    <Name>Test Hotel 2</Name> 
    </DailyContract> 
</DailyContracts> 
</Contracts> 

我的問題很簡單我怎能取代[0],以便它檢查所有外聯網合同?我試圖用.findAll和替換但沒有運氣。

回答

0

下面一行試試吧:

def ExtranetContract = ContractType.DailyContract[0][email protected] 

給你FilteredNodeChildren一個實例。由於此類是Iterable的實例,因此您可以使用spread運營商:

import groovy.util.XmlSlurper 

def input = '''<Contracts> 
<DailyContracts Type="S"> 
    <DailyContract Type="FIT" Code="xxx" Start="2017-08-15" Days="7"> 
     <Name>Extranet</Name> 
    </DailyContract> 
    </DailyContracts> 
<DailyContracts Type="C"> 
    <DailyContract Type="FIT" Code="xxx" Start="2017-08-15" Days="7" ExtranetContract="true"> 
    <Name>Melia Costa Del Sol Extranet</Name> 
    </DailyContract> 
    <DailyContract Type="FIT" Code="xxx" Start="2017-08-15" Days="7" ExtranetContract="true"> 
    <Name>Melia Costa Del Sol Extranet 2</Name> 
    </DailyContract> 
</DailyContracts> 
</Contracts>''' 

def slurped = new XmlSlurper().parseText(input) 

def ContractType = slurped.DailyContracts.findAll { [email protected] == "C"} 

def ExtranetContract = ContractType.DailyContract*[email protected] 

assert ExtranetContract.size() == 2 && ExtranetContract.every { it == 'true' } 
1

你做到這一點,如下:

//Pass the response as String to parseText method 
def xml = new XmlSlurper().parseText(response) 
//Get the Daily Contracts of type C 
def contracts = xml.'**'.findAll { it.name() == 'DailyContracts' && [email protected] == 'C'} 
//Get the ExtranetContract values 
def eCon = contracts.DailyContract*[email protected] 
assert eCon instanceof List 
assert !(false in eCon) 

您可以快速地在線Demo

相關問題