2017-05-18 35 views
0

字符串我想要检索的<logs>元素为String数组,我想以下几点:检索整个节点与的XmlSlurper

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在所有可能的或者我应该使用一些字符串操作?

回答

2

您可以使用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 
+0

我认为这是最优雅的解决方案,谢谢! –

1

试试这个:

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

你可以去:

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

谢谢,它的伟大工程! –