あなたが呼ぶ:
def fun = new ArrayList(root.listofthings.collect{it})
どのセットfun
がノードになるか<listofthings>
(そしてbtwは次のように短縮できますdef fun = root.listofthings
:)
次に、次のようになります。
fun.each {
root.listofthings.appendNode it
}
このノードをノードに追加します<listofthings>
。これは、ツリーが終了しないことを意味します(ノードをそれ自体にアタッチしているため)。したがって、StackOverflowException
コードを実行するには、次のように変更します。
import groovy.xml.StreamingMarkupBuilder
def xml = """<container>
| <listofthings>
| <thing id="100" name="foo"/>
| </listofthings>
|</container>""".stripMargin()
def root = new XmlSlurper().parseText(xml)
root.listofthings.thing*.replaceNode {}
root.listofthings.appendNode {
thing( id:102, name:'baz' )
}
def outputBuilder = new StreamingMarkupBuilder()
String result = outputBuilder.bind { mkp.yield root }
print result
つまり、再帰的なノードの追加を取り除きます。
ただし、再帰加算で何をしようとしていたのかわからないので、おそらくこれではやりたいことができません...見たい結果について詳しく説明していただけますか?
編集
私はXmlParserにあなたがやろうとしていたと思うことをやらせることができましたか?
def xml = """<container>
| <listofthings>
| <thing id="100" name="foo"/>
| </listofthings>
|</container>""".stripMargin()
def root = new XmlParser().parseText(xml)
def listofthings = root.find { it.name() == 'listofthings' }
def nodes = listofthings.findAll { it.name() == 'thing' }
listofthings.remove nodes
listofthings.appendNode( 'thing', [ id:102, name:'baz' ] )
nodes.each {
listofthings.appendNode( it.name(), it.attributes(), it.value() )
}
def writer = new StringWriter()
new XmlNodePrinter(new PrintWriter(writer)).print(root)
def result = writer.toString()
print result
それは印刷します:
<container>
<listofthings>
<thing id="102" name="baz"/>
<thing id="100" name="foo"/>
</listofthings>
</container>