def string = '''<soapenv:Envelope xmlns:soapenv="http://s...content-available-to-author-only...p.org/soap/envelope/" xmlns:ns="http://w...content-available-to-author-only...l.org/OTA/2003/05">
<soapenv:Header/>
<soapenv:Body>
<OTA_HotelAvailRQ EchoToken="1234" RateRangeOnly="true" Target="Test" TimeStamp="2006-07-04T09:00:27.1343316+02:00" TransactionIdentifier="b123456789" Version="4.000" xsi:schemaLocation="http://w...content-available-to-author-only...l.org/OTA/2003/05 OTA_HotelAvailRQ.xsd" xmlns="http://w...content-available-to-author-only...l.org/OTA/2003/05" xmlns:xsi="http://w...content-available-to-author-only...3.org/2001/XMLSchema-instance">
<AvailRequestSegments>
<AvailRequestSegment>
<HotelSearchCriteria>
<Criterion>
</Criterion>
</HotelSearchCriteria>
</AvailRequestSegment>
</AvailRequestSegments>
</OTA_HotelAvailRQ>
</soapenv:Body>
</soapenv:Envelope>'''
def xml = new XmlSlurper().parseText(string)
def map = ['03062': 'ABC', '03092': 'ABC', '03144': 'ABC']
criteria = xml.'**'.find {'Criterion' == it.name()}
criteria.appendNode {
map.each { k, v ->
HotelRef('ChainCode' : v, 'HotelCode': k)
}
}
println groovy.xml.XmlUtil.serialize(xml)
ZGVmIHN0cmluZyA9ICcnJzxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5wLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6bnM9Imh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5sLm9yZy9PVEEvMjAwMy8wNSI+CiAgIDxzb2FwZW52OkhlYWRlci8+CiAgIDxzb2FwZW52OkJvZHk+CiAgICAgIDxPVEFfSG90ZWxBdmFpbFJRIEVjaG9Ub2tlbj0iMTIzNCIgUmF0ZVJhbmdlT25seT0idHJ1ZSIgVGFyZ2V0PSJUZXN0IiBUaW1lU3RhbXA9IjIwMDYtMDctMDRUMDk6MDA6MjcuMTM0MzMxNiswMjowMCIgVHJhbnNhY3Rpb25JZGVudGlmaWVyPSJiMTIzNDU2Nzg5IiBWZXJzaW9uPSI0LjAwMCIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubC5vcmcvT1RBLzIwMDMvMDUgT1RBX0hvdGVsQXZhaWxSUS54c2QiIHhtbG5zPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubC5vcmcvT1RBLzIwMDMvMDUiIHhtbG5zOnhzaT0iaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLjMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KICAgICAgICAgPEF2YWlsUmVxdWVzdFNlZ21lbnRzPiAKICAgICAgICAgICAgPEF2YWlsUmVxdWVzdFNlZ21lbnQ+CiAgICAgICAgICAgICAgIDxIb3RlbFNlYXJjaENyaXRlcmlhPgogICAgICAgICAgICAgICAgICA8Q3JpdGVyaW9uPiAgIAogICAgICAgICAgICAgICAgICA8L0NyaXRlcmlvbj4KICAgICAgICAgICAgICAgPC9Ib3RlbFNlYXJjaENyaXRlcmlhPgogICAgICAgICAgICA8L0F2YWlsUmVxdWVzdFNlZ21lbnQ+CiAgICAgICAgIDwvQXZhaWxSZXF1ZXN0U2VnbWVudHM+CiAgICAgIDwvT1RBX0hvdGVsQXZhaWxSUT4KICAgPC9zb2FwZW52OkJvZHk+Cjwvc29hcGVudjpFbnZlbG9wZT4nJycKCmRlZiB4bWwgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dChzdHJpbmcpCmRlZiBtYXAgPSBbJzAzMDYyJzogJ0FCQycsICcwMzA5Mic6ICdBQkMnLCAnMDMxNDQnOiAnQUJDJ10KCmNyaXRlcmlhID0geG1sLicqKicuZmluZCB7J0NyaXRlcmlvbicgPT0gaXQubmFtZSgpfQpjcml0ZXJpYS5hcHBlbmROb2RlIHsKCW1hcC5lYWNoIHsgaywgdiAtPgoJCUhvdGVsUmVmKCdDaGFpbkNvZGUnIDogdiwgJ0hvdGVsQ29kZSc6IGspCgl9Cn0KcHJpbnRsbiBncm9vdnkueG1sLlhtbFV0aWwuc2VyaWFsaXplKHhtbCk=