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>
<RoomStayCandidates>
<RoomStayCandidate Quantity="1">
<GuestCounts>
<GuestCount AgeQualifyingCode="1" Count="1"/>
</GuestCounts>
</RoomStayCandidate>
</RoomStayCandidates>
</Criterion>
</HotelSearchCriteria>
</AvailRequestSegment>
</AvailRequestSegments>
</OTA_HotelAvailRQ>
</soapenv:Body>
</soapenv:Envelope>'''
def xml = new XmlParser(false, false).parseText(string)
def map = ['03062': 'ABC', '03092': 'ABC', '03144': 'ABC']
criteria = xml.'**'.find {'Criterion' == it.name()}
def criteriaChilds = criteria.children()
map.each { k, v ->
def nNode = new Node(null, 'HotelRef', [ChainCode:v, HotelCode:k])
criteriaChilds.add(0, nNode)
}
println groovy.xml.XmlUtil.serialize(xml)
ZGVmIHN0cmluZyA9ICcnJzxzb2FwZW52OkVudmVsb3BlIHhtbG5zOnNvYXBlbnY9Imh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5wLm9yZy9zb2FwL2VudmVsb3BlLyIgeG1sbnM6bnM9Imh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5sLm9yZy9PVEEvMjAwMy8wNSI+CiAgIDxzb2FwZW52OkhlYWRlci8+CiAgIDxzb2FwZW52OkJvZHk+CiAgICAgIDxPVEFfSG90ZWxBdmFpbFJRIEVjaG9Ub2tlbj0iMTIzNCIgUmF0ZVJhbmdlT25seT0idHJ1ZSIgVGFyZ2V0PSJUZXN0IiBUaW1lU3RhbXA9IjIwMDYtMDctMDRUMDk6MDA6MjcuMTM0MzMxNiswMjowMCIgVHJhbnNhY3Rpb25JZGVudGlmaWVyPSJiMTIzNDU2Nzg5IiBWZXJzaW9uPSI0LjAwMCIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubC5vcmcvT1RBLzIwMDMvMDUgT1RBX0hvdGVsQXZhaWxSUS54c2QiIHhtbG5zPSJodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4ubC5vcmcvT1RBLzIwMDMvMDUiIHhtbG5zOnhzaT0iaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLjMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIj4KICAgICAgICAgPEF2YWlsUmVxdWVzdFNlZ21lbnRzPiAKICAgICAgICAgICAgPEF2YWlsUmVxdWVzdFNlZ21lbnQ+CiAgICAgICAgICAgICAgIDxIb3RlbFNlYXJjaENyaXRlcmlhPgogICAgICAgICAgICAgICAgICA8Q3JpdGVyaW9uPgogICAgICAgICAgICAgICAgICAgIDxSb29tU3RheUNhbmRpZGF0ZXM+CiAgICAgICAgICAgICAgICAgICAgICAgIDxSb29tU3RheUNhbmRpZGF0ZSBRdWFudGl0eT0iMSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxHdWVzdENvdW50cz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEd1ZXN0Q291bnQgQWdlUXVhbGlmeWluZ0NvZGU9IjEiIENvdW50PSIxIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvR3Vlc3RDb3VudHM+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvUm9vbVN0YXlDYW5kaWRhdGU+CQkJCQkJIAogICAgICAgICAgICAgICAgICAgICA8L1Jvb21TdGF5Q2FuZGlkYXRlcz4KICAgICAgICAgICAgICAgICAgPC9Dcml0ZXJpb24+CiAgICAgICAgICAgICAgIDwvSG90ZWxTZWFyY2hDcml0ZXJpYT4KICAgICAgICAgICAgPC9BdmFpbFJlcXVlc3RTZWdtZW50PgogICAgICAgICA8L0F2YWlsUmVxdWVzdFNlZ21lbnRzPgogICAgICA8L09UQV9Ib3RlbEF2YWlsUlE+CiAgIDwvc29hcGVudjpCb2R5Pgo8L3NvYXBlbnY6RW52ZWxvcGU+JycnCgpkZWYgeG1sID0gbmV3IFhtbFBhcnNlcihmYWxzZSwgZmFsc2UpLnBhcnNlVGV4dChzdHJpbmcpCmRlZiBtYXAgPSBbJzAzMDYyJzogJ0FCQycsICcwMzA5Mic6ICdBQkMnLCAnMDMxNDQnOiAnQUJDJ10KCmNyaXRlcmlhID0geG1sLicqKicuZmluZCB7J0NyaXRlcmlvbicgPT0gaXQubmFtZSgpfQpkZWYgY3JpdGVyaWFDaGlsZHMgPSBjcml0ZXJpYS5jaGlsZHJlbigpCm1hcC5lYWNoIHsgaywgdiAtPgoJZGVmIG5Ob2RlID0gbmV3IE5vZGUobnVsbCwgJ0hvdGVsUmVmJywgW0NoYWluQ29kZTp2LCBIb3RlbENvZGU6a10pCgljcml0ZXJpYUNoaWxkcy5hZGQoMCwgbk5vZGUpCn0KcHJpbnRsbiBncm9vdnkueG1sLlhtbFV0aWwuc2VyaWFsaXplKHhtbCk=