如何使用groovy XMLSlurper更新XML?

时间:2010-11-04 13:29:36

标签: xml groovy

我阅读了关于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中节点的克隆方法。有没有解决办法来实现这个目标?

2 个答案:

答案 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)