在XML中插入子节点

时间:2019-03-15 15:44:04

标签: groovy xml-parsing xmlslurper

需要使用Groovy在XML中的特定节点后提供简单插入节点的帮助。通过搜索现有帖子可以找到更接近但不够的

import groovy.xml.*

def x='''<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns7:setPlayerInfoRequest xmlns:ns7="http://www.playtech.com/services/player-management">
    <ns7:behaviourType>Create</ns7:behaviourType>
    <ns7:playerDataMap>
        <ns7:currency>${p_currency}</ns7:currency>
    </ns7:playerDataMap>
</ns7:setPlayerInfoRequest>'''

def n = '''<ns7:custom01>custom01</ns7:custom01>'''

def xml=new XmlParser().parseText(x)

def node = new XmlSlurper(false,false).parseText(n)

def nodes = xml.'**'.findAll{ it.name().localPart == 'currency' }

nodes.each{it.parent().appendNode(node)}

XmlUtil.serialize(xml).toString()

结果

<?xml version="1.0" encoding="UTF-8"?><ns7:setPlayerInfoRequest xmlns:ns7="http://www.playtech.com/services/player-management">
  <ns7:behaviourType>Create</ns7:behaviourType>
  <ns7:playerDataMap>
    <ns7:currency>${p_currency}</ns7:currency>
    <custom01/>
  </ns7:playerDataMap>
</ns7:setPlayerInfoRequest>

预期结果是在父playerDataMap下插入了<ns7:custom01>custom01</ns7:custom01>

1 个答案:

答案 0 :(得分:0)

  1. 您使用XmlSlurpernode创建n。但是您应该像上一行一样使用XmlParser
  2. 您还应该在it.parent().append(node)行中使用nodes.each { it.parent().appendNode(node) }

应用这两项更改后,它将按您期望的那样工作