Groovy как конвертировать xml файл в одну строку - PullRequest
0 голосов
/ 04 марта 2020

У меня есть запрос XML в виде файла, который я хочу добавить в файл taurus yaml. Для файла yaml требуется строка из одной строки.

У меня он работает с файлом json, делая это;

    strMessage=getFileContents("request.json");
    //Use a jsonslurper to process the message
    def jsonSlurper = new groovy.json.JsonSlurper()
    def mapMessage = jsonSlurper.parseText(strMessage)
    def jsonMessage= groovy.json.JsonOutput.toJson(mapMessage)
    request = jsonMessage

Так что я пытаюсь выполнить тот же процесс с xml эквиваленты;

        strMessage=getFileContents("request.xml")
        //Use an xmlslurper to process the message
        def xmlSlurper = new groovy.util.XmlSlurper()
        def mapMessage = xmlSlurper.parseText(strMessage)
        def xmlMessage = groovy.util.XmlUtil.serialize(mapMessage)
        request = xmlMessage

К сожалению, хотя вывод json выводится в одной строке, версия xml выходит аналогично файлу с большим количеством разрывов строк.

причина, по которой я использую slurpers, заключается в переформатировании файлов, поскольку я не могу контролировать исходные файлы. Мне пришло в голову, что я могу просто проглотить файл и удалить разрывы строк, но запрос в файле yaml будет иметь огромное количество пробелов. И, очевидно, я не могу удалить разрывы строк и пробелы, потому что некоторые пробелы допустимы.

До 'mapMessage' он работает как положено, это всего лишь последний бит, чтобы преобразовать карту в одну XML строку, которая меня побила. какая команда выведет Groovy объект карты в одну строку XML?

1 Ответ

1 голос
/ 04 марта 2020

без единой строки кода, но возможно сделать с нативными groovy классами и XmlParser (не XmlSlurper)

Примечание: данные внутри xml могут содержать разрывы строк, и следующий код будет сохранить их

def strMessage='''
<a>
    <b>123</b>
    <c>the message</c>
    <d>multiline
message</d>
</a>
'''

def xmlWritable(groovy.util.Node n, boolean indent, boolean xmlDeclaration=true){
    return new Writable(){
        Writer writeTo(Writer w){
            if(xmlDeclaration){
                w << '<?xml version="1.0" encoding="UTF-8"?>'
                w << ( indent ? '\n' : '' )
            }
            IndentPrinter p = new IndentPrinter(w,indent?"  ":"",indent)
            XmlNodePrinter nodePrinter = new XmlNodePrinter(p)
            nodePrinter.setPreserveWhitespace(true)
            nodePrinter.print(n)
            return w
        }
        String toString(){
            writeTo(new StringWriter()).toString()
        }
    }
}


def xmlParser = new XmlParser()
def mapMessage = xmlParser.parseText(strMessage)
def xmlMessage = xmlWritable(mapMessage,false,false).toString()

результат:

<a><b>123</b><c>the message</c><d>multiline
message</d></a>

PS:

...