0

I want to retrieve the elements of <logs> as array of String and I am trying the following:

import groovy.util.XmlSlurper

def payload = '''<logs>
<log>
  <text>LOG 1</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
<log>
  <text>LOG 2</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
</logs>'''

def logs = new XmlSlurper().parseText(payload)
def result = []
logs.log.each{
  result.add(it)
}
result

​However, I am getting the values, but I would like to get the whole node as text, more or less this:

[<log>
  <text>LOG 1</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>,
<log>
  <text>LOG 2</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>]

Is this at all possible with XmlSlurper or should I use some String operations?

Opal
  • 81,889
  • 28
  • 189
  • 210
Stanislav Ivanov
  • 425
  • 2
  • 7
  • 19

3 Answers3

4

You can use XmlUtil but have to remove the xml declaration:

import groovy.util.XmlSlurper
import groovy.xml.XmlUtil

def payload = '''<logs>
<log>
  <text>LOG 1</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
<log>
  <text>LOG 2</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
</logs>'''

def logs = new XmlSlurper().parseText(payload)

def result = logs.log.collect { 
  XmlUtil.serialize(it).replaceAll(/<.xml.*?>/,"") 
}

println result
1

Try this:

    def payload = '''<logs>
<log>
  <text>LOG 1</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
<log>
  <text>LOG 2</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
</logs>'''

def logs = new XmlSlurper().parseText(payload)
def result = []
logs.log.each{
  result.add( "<log> <text>" + it?.'text'.text() + "</text> <timestamp> " + it?.'timestamp'.text() + "</timestamp> </log>")
}
return result
​
1

You can go with:

def payload = '''<logs>
<log>
  <text>LOG 1</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
<log>
  <text>LOG 2</text>
  <timestamp>2017-05-18T16:20:00.000</timestamp>
</log>
</logs>'''

def logs = new XmlParser().parseText(payload) 
def result = logs.log.collect {  
    def sw = new StringWriter()
    def pw = new PrintWriter(sw)
    new XmlNodePrinter(pw).print(it)
    sw.toString().replaceAll('\\s', '')
}
Opal
  • 81,889
  • 28
  • 189
  • 210