Groovy 棒极了。使用MarkupBuilder和XMLSlurper时追加节点

Groovy 棒极了。使用MarkupBuilder和XMLSlurper时追加节点,groovy,xmlslurper,markupbuilder,Groovy,Xmlslurper,Markupbuilder,我的问题是在使用MarkupBuilder和XMLSlurper时使用Groovy并附加一个节点 有人能告诉我为什么当我运行此代码直到第一次打印时,我的输出显示目标行为: <target-line>0</target-line> 0 但当我运行到第二个println时,目标行的输出现在是: <target-line> <target-line>7</target-line> </target-line> //

我的问题是在使用MarkupBuilder和XMLSlurper时使用Groovy并附加一个节点

有人能告诉我为什么当我运行此代码直到第一次打印时,我的输出显示目标行为:

<target-line>0</target-line>
0
但当我运行到第二个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)


    }
}

7.
//完整代码
导入groovy.xml*
公共类AppendNodeExample{
//建造师
公共附录nodeExample(){
}
def CreateNewMessage(){
def dataToProcess='0100'+
“塔特拉消息”+
'Info.REB'+
“REB消息信息。”+
'7'+
“取消绑定消息信息。”+
''
def rootNode=new XmlSlurper().parseText(dataToProcess.replaceAll(“:”,“-”)
def newXmlFile=newStringWriter()
def xmlCladNew=new groovy.xml.MarkupBuilder(newXmlFile)
xmlCladNew.response()
{
“应用的编辑”()
{
rootNode.“已应用的编辑”。line.each
{appliedEditsLine->
线
{
id(appliedEditsLine.id)
appliedEditsLine.flag.each
{nodeLineFlag->
旗帜
{
助记符(nodeLineFlag.助记符)
消息(nodeLineFlag.message)
“目标行”(“0”)
}
}
} 
}
}
}
def rootNodeNew=new XmlSlurper().parseText(newXmlFile.toString())
//第一打印Ln
println XmlUtil.serialize(rootNodeNew)
rootNodeNew.“已应用的编辑”。行。每行
{line->
line.flag.each
{lineFlag->
if(lineFlag.助记符=='REB'){
appendNode({'target-line'('7')})
}否则{
//删除目标线节点
lineFlag.'target-line'.replaceNode{}
}
}
}
serialize(新StreamingMarkupBuilder().bind{mkp.yield rootNodeNew})
//第二次印刷
println XmlUtil.serialize(rootNode)
}
}

重新格式化代码,使其可读,并遵循任何类型的指导原则,以便更容易发现错误:

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>'''.stripMargin()

        def rootNode = new XmlSlurper().parseText( dataToProcess )

        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 )
    }
}

new AppendNodeExample().createNewMessage()
导入groovy.xml* 公共类AppendNodeExample{ //建造师 公共附录nodeExample(){ } def createNewMessage(){ def dataToProcess='' | | | 0100 | |茶 |TRA消息信息。 | | |雷布 |REB消息信息。 | | 7 | | | |UNB |UNB消息信息。 | | | |''.stripMargin() def rootNode=new XmlSlurper().parseText(dataToProcess) def newXmlFile=newStringWriter() def xmlCladNew=new groovy.xml.MarkupBuilder(newXmlFile) xmlCladNew.response{ “应用编辑”{ rootNode.applied-edits.line.each{appliedEditsLine-> 线{ id(appliedEditsLine.id) appliedEditsLine.flag.each{nodeLineFlag-> 旗{ 助记符(nodeLineFlag.助记符) 消息(nodeLineFlag.message) “目标行”(“0”) } } } } } } def rootNodeNew=new XmlSlurper().parseText(newXmlFile.toString()) //第一打印Ln println XmlUtil.serialize(rootNodeNew) rootNodeNew.'applied-edits'.line.each{line-> line.flag.each{lineFlag-> if(lineFlag.助记符=='REB'){ lineFlag.appendNode{“目标行”(“7”)} }否则{ //删除目标线节点 lineFlag.'target-line'.replaceNode{} } } } serialize(新StreamingMarkupBuilder().bind{mkp.yield rootNodeNew}) //第二次印刷 println XmlUtil.serialize(rootNode) } } 新建AppendNodeExample().createNewMessage() 在第二个println中,您打印的是原始
rootNode
,您没有对其做任何操作,因此它只包含原始
7
节点