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(false, false).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+Cjwvc29hcGVudjpFbnZlbG9wZT4nJycKCmRlZiB4bWwgPSBuZXcgWG1sU2x1cnBlcihmYWxzZSwgZmFsc2UpLnBhcnNlVGV4dChzdHJpbmcpCmRlZiBtYXAgPSBbJzAzMDYyJzogJ0FCQycsICcwMzA5Mic6ICdBQkMnLCAnMDMxNDQnOiAnQUJDJ10KCmNyaXRlcmlhID0geG1sLicqKicuZmluZCB7J0NyaXRlcmlvbicgPT0gaXQubmFtZSgpfQpjcml0ZXJpYS5hcHBlbmROb2RlIHsKCW1hcC5lYWNoIHsgaywgdiAtPgoJCUhvdGVsUmVmKCdDaGFpbkNvZGUnIDogdiwgJ0hvdGVsQ29kZSc6IGspCgl9Cn0KcHJpbnRsbiBncm9vdnkueG1sLlhtbFV0aWwuc2VyaWFsaXplKHhtbCk=