-1

私の質問は、MarkupBuilder と XMLSlurper を使用しているときに Groovy とノードを追加することです。

このコードを最初の println まで実行すると、出力にターゲット行が次のように表示される理由を教えてください。

<target-line>0</target-line>

しかし、2 番目の println まで実行すると、ターゲット行の出力は次のようになります。

<target-line>
    <target-line>7</target-line>
</target-line>

// Complete code
import groovy.xml.*
public class AppendNodeExample {
    //Constructor
    public AppendNodeExample() {

    }

    def CreateNewMessage() {
def dataToProcess = '<response><applied-edits><line><id>0100</id>' +
                 '<flag><mnemonic>TRA</mnemonic><message>TRA Message ' +
                 'Info.</message></flag><flag><mnemonic>REB</mnemonic>' +
                 '<message>REB Message Info.</message><target-line>' +
                 '<target-line>7</target-line></target-line></flag><flag>'+
                 '<mnemonic>UNB</mnemonic><message>UNB Message Info.</message>'+
                 '</flag></line></applied-edits></response>'
def rootNode = new XmlSlurper().parseText(dataToProcess.replaceAll(':','-') )

def newXmlFile = new StringWriter()
def xmlCladNew = new groovy.xml.MarkupBuilder(newXmlFile)

xmlCladNew.response() 
{

    'applied-edits'()
    {

        rootNode.'applied-edits'.line.each
        { appliedEditsLine ->

            line 
            {
                id(appliedEditsLine.id)

                appliedEditsLine.flag.each
                { nodeLineFlag ->
                    flag 
                    {
                    mnemonic(nodeLineFlag.mnemonic)
                    message(nodeLineFlag.message)
                        'target-line'('0')
                    }
                }
            } 
        }
    }
}

def rootNodeNew = new XmlSlurper().parseText(newXmlFile.toString())
// First println
          println XmlUtil.serialize(rootNodeNew)

rootNodeNew.'applied-edits'.line.each 
{ line -> 

    line.flag.each
    { lineFlag ->
        if (lineFlag.mnemonic == 'REB') {

            lineFlag.appendNode({'target-line'('7')})
        } else {
            // Remove the target-line node
            lineFlag.'target-line'.replaceNode {}

        }
    }
}

XmlUtil.serialize(new StreamingMarkupBuilder().bind {mkp.yield rootNodeNew} )
          // Second println
println XmlUtil.serialize(rootNode)


    }
}
4

1 に答える 1