我阅读了关于Updating XML with XmlSlurper的Groovy Codehaus文章,这引出了以下问题。考虑我们有一个输入XML结构为即将到来的:
<customer>
<address>
<street />
<city />
<postalcode />
</address>
</customer>
是否可以在不知道其具体结构的情况下更改XML?具体:我们引用了address
节点并希望在不知道任何细节的情况下将其相乘3次?
address.multiply(3)
输出应如下所示:
<customer>
<address>
<street />
<city />
<postalcode />
</address>
<address>
<street />
<city />
<postalcode />
</address>
<address>
<street />
<city />
<postalcode />
</address>
</customer>
appendNode
这可能是可能的,但我缺少groovy中节点的克隆方法。有没有解决办法来实现这个目标?
答案 0 :(得分:9)
我目前能够想到克隆节点的唯一方法是将它们序列化为文本,然后将它们作为xml的新位解析回来
像这样:
import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil
def xml = """
<customer>
<address>
<street />
<city />
<postalcode />
</address>
</customer>
"""
def root = new XmlSlurper().parseText( xml )
2.times {
String addressXml = new StreamingMarkupBuilder().bindNode( root.address )
clonedAddress = new XmlSlurper().parseText( addressXml )
root.appendNode( clonedAddress )
}
println XmlUtil.serialize( root )
打印出来:
<?xml version="1.0" encoding="UTF-8"?>
<customer>
<address>
<street/>
<city/>
<postalcode/>
</address>
<address>
<street/>
<city/>
<postalcode/>
</address>
<address>
<street/>
<city/>
<postalcode/>
</address>
</customer>
这可能是一种更简洁的方式......但此刻,我的思绪一片空白......
答案 1 :(得分:1)
GPathResult.replaceBody()
适合我。例如:
http://www.javamonamour.org/2011/11/groovy-modifying-xml-with-xmlslurper.html