私の質問は、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)
}
}