如何使用groovy的XML Slurper更新XML?

Chr*_*wes 4 xml groovy

我阅读了Groovy Codehaus关于使用XmlSlurper更新XML的文章,这引出了以下问题.考虑我们有一个输入XML结构为即将到来的:

<customer>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
</customer>
Run Code Online (Sandbox Code Playgroud)

是否可以在不知道其具体结构的情况下更改XML?具体:我们有一个address节点的参考,想要在不知道任何细节的情况下将它乘以3次?

address.multiply(3)
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

<customer>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
  <address>
    <street />
    <city />
    <postalcode />
  </address>
</customer>
Run Code Online (Sandbox Code Playgroud)

这可能是可能的,appendNode但我缺少groovy中节点的克隆方法.有没有解决方案来实现这一目标?

tim*_*tes 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 )
Run Code Online (Sandbox Code Playgroud)

打印出来:

<?xml version="1.0" encoding="UTF-8"?>
<customer>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
  <address>
    <street/>
    <city/>
    <postalcode/>
  </address>
</customer>
Run Code Online (Sandbox Code Playgroud)

可能有一种更简洁的方式来做这件事......但此刻,我的思绪一片空白......