def str = '''<soap:Envelope xmlns:soap="http://s...content-available-to-author-only...p.org/soap/envelope/">
<SOAP-ENV:Header xmlns:SOAP-ENV="http://s...content-available-to-author-only...p.org/soap/envelope/"/>
<soap:Body>
<ns2:OTA_HotelSearchRS AltLangID="en" EchoToken="20BB36F8AC152AC46E95033289D89328" PrimaryLangID="en" RetransmissionIndicator="false" Target="Test" TimeStamp="2019-04-07T15:35:51.869-07:00" TransactionIdentifier="SmokeTestHotelSearch" TransactionStatusCode="" Version="1.003" xmlns:ns2="http://w...content-available-to-author-only...l.org/OTA/2003/05">
<ns2:Success/>
<ns2:Properties>
<ns2:Property ChainCode="ABC" HotelCode="03062">
<ns2:RelativePosition Distance="3.0" Name="City Center" UnitOfMeasureCode="1"/>
</ns2:Property>
<ns2:Property ChainCode="ABC" HotelCode="03092">
<ns2:RelativePosition Distance="7.44" Name="City Center" UnitOfMeasureCode="1"/>
</ns2:Property>
<ns2:Property ChainCode="ABC" HotelCode="03144">
<ns2:RelativePosition Distance="8.04" Name="City Center" UnitOfMeasureCode="1"/>
</ns2:Property>
</ns2:Properties>
</ns2:OTA_HotelSearchRS>
</soap:Body>
</soap:Envelope>'''
def xml = new XmlSlurper().parseText(str)
def map = xml.'**'.findAll {'Property' == it.name()}.collectEntries{ [(it.@HotelCode.text()): it.@ChainCode.text()]}
println map
ZGVmIHN0ciA9ICcnJzxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9Imh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5wLm9yZy9zb2FwL2VudmVsb3BlLyI+CiAgIDxTT0FQLUVOVjpIZWFkZXIgeG1sbnM6U09BUC1FTlY9Imh0dHA6Ly9zLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5wLm9yZy9zb2FwL2VudmVsb3BlLyIvPgogICA8c29hcDpCb2R5PgogICAgICA8bnMyOk9UQV9Ib3RlbFNlYXJjaFJTIEFsdExhbmdJRD0iZW4iIEVjaG9Ub2tlbj0iMjBCQjM2RjhBQzE1MkFDNDZFOTUwMzMyODlEODkzMjgiIFByaW1hcnlMYW5nSUQ9ImVuIiBSZXRyYW5zbWlzc2lvbkluZGljYXRvcj0iZmFsc2UiIFRhcmdldD0iVGVzdCIgVGltZVN0YW1wPSIyMDE5LTA0LTA3VDE1OjM1OjUxLjg2OS0wNzowMCIgVHJhbnNhY3Rpb25JZGVudGlmaWVyPSJTbW9rZVRlc3RIb3RlbFNlYXJjaCIgVHJhbnNhY3Rpb25TdGF0dXNDb2RlPSIiIFZlcnNpb249IjEuMDAzIiB4bWxuczpuczI9Imh0dHA6Ly93Li4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5sLm9yZy9PVEEvMjAwMy8wNSI+CiAgICAgICAgIDxuczI6U3VjY2Vzcy8+CiAgICAgICAgIDxuczI6UHJvcGVydGllcz4KICAgICAgICAgICAgPG5zMjpQcm9wZXJ0eSBDaGFpbkNvZGU9IkFCQyIgSG90ZWxDb2RlPSIwMzA2MiI+CiAgICAgICAgICAgICAgIDxuczI6UmVsYXRpdmVQb3NpdGlvbiBEaXN0YW5jZT0iMy4wIiBOYW1lPSJDaXR5IENlbnRlciIgVW5pdE9mTWVhc3VyZUNvZGU9IjEiLz4KICAgICAgICAgICAgPC9uczI6UHJvcGVydHk+CiAgICAgICAgICAgIDxuczI6UHJvcGVydHkgQ2hhaW5Db2RlPSJBQkMiIEhvdGVsQ29kZT0iMDMwOTIiPgogICAgICAgICAgICAgICA8bnMyOlJlbGF0aXZlUG9zaXRpb24gRGlzdGFuY2U9IjcuNDQiIE5hbWU9IkNpdHkgQ2VudGVyIiBVbml0T2ZNZWFzdXJlQ29kZT0iMSIvPgogICAgICAgICAgICA8L25zMjpQcm9wZXJ0eT4KICAgICAgICAgICAgPG5zMjpQcm9wZXJ0eSBDaGFpbkNvZGU9IkFCQyIgSG90ZWxDb2RlPSIwMzE0NCI+CiAgICAgICAgICAgICAgIDxuczI6UmVsYXRpdmVQb3NpdGlvbiBEaXN0YW5jZT0iOC4wNCIgTmFtZT0iQ2l0eSBDZW50ZXIiIFVuaXRPZk1lYXN1cmVDb2RlPSIxIi8+CiAgICAgICAgICAgIDwvbnMyOlByb3BlcnR5PgogICAgICAgICA8L25zMjpQcm9wZXJ0aWVzPgogICAgICA8L25zMjpPVEFfSG90ZWxTZWFyY2hSUz4KICAgPC9zb2FwOkJvZHk+Cjwvc29hcDpFbnZlbG9wZT4nJycKCmRlZiB4bWwgPSBuZXcgWG1sU2x1cnBlcigpLnBhcnNlVGV4dChzdHIpCmRlZiBtYXAgPSB4bWwuJyoqJy5maW5kQWxsIHsnUHJvcGVydHknID09IGl0Lm5hbWUoKX0uY29sbGVjdEVudHJpZXN7IFsoaXQuQEhvdGVsQ29kZS50ZXh0KCkpOiBpdC5AQ2hhaW5Db2RlLnRleHQoKV19CnByaW50bG4gbWFw