1

//xml slurper を使用して、置き換えられたノードを xml に戻すことができません。スタックオーバーフロー例外をスローします。今それを行う方法を考えます

def xml = """<container>
                   <listofthings>
                       <thing id="100" name="foo"/>
                   </listofthings>
                 </container>"""

    def root = new XmlSlurper().parseText(xml)
    def fun = new ArrayList(root.listofthings.collect{it})
    root.listofthings.thing.each {
       it.replaceNode {}
       }
    root.listofthings.appendNode  ( { thing(id:102, name:'baz') })
    fun.each {
    root.listofthings.appendNode it
    }

    def outputBuilder = new groovy.xml.StreamingMarkupBuilder()
    String result = outputBuilder.bind { mkp.yield root }
    print result
4

1 に答える 1

0

あなたが呼ぶ:

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>
于 2012-04-02T08:55:17.493 に答える