Если вы хотите избавиться только от \ t и \ n, вы можете сделать что-то вроде этого:
s.collect { it != "\n" && it != "\t" ? it : "" }.join()
Это, конечно, предполагает, что семантически значимых пробельных символов в качестве значений атрибутов нет.
Это приведет к тому же эффекту, что и ваш пример, но не будет ничего делать для удаления пробелов. Удаление пробелов намного сложнее, так как вам нужен хотя бы один символ пробела между именами атрибутов и тегами, и вы не можете удалить их из значений.
Я не думаю, что есть короткий или элегантный способ сделать это. Вам нужно будет работать с реальным парсером XML. Что-то вроде XMLSlurper было бы хорошим началом.
EDIT
Другая возможность выглядит примерно так:
def root = new XmlParser().parseText(xml)
new XmlNodePrinter(preserveWhitespace:false).print(root.body[0])
Проблема с этим решением состоит в том, что строка довольно напечатана с новыми строками и отступами, но вы можете объединить первый пример со вторым, чтобы преобразовать красивую строку.