使用 XmlSlurper 将整个节点作为字符串检索

Retrieve a whole node as a string with XmlSlurper

我想检索 <logs> 的元素作为 String 的数组,我正在尝试以下操作:

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

但是,我正在获取值,但我想将整个节点作为文本获取,或多或少是这样的:

[<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>]

这完全可以用 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( "<log> <text>" + it?.'text'.text() + "</text> <timestamp> " + it?.'timestamp'.text() + "</timestamp> </log>")
}
return result
​

你可以选择:

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', '')
}

您可以使用 XmlUtil,但必须删除 xml 声明:

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