Вставить дочерний узел в XML - PullRequest
0 голосов
/ 15 марта 2019

нужна помощь с простой вставкой узла после конкретного в XML с использованием Groovy.Поиск по существующим сообщениям подошел к этому, ближе, но недостаточно

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>

Ожидаемый результат - вставка <ns7:custom01>custom01</ns7:custom01> в родительский playerDataMap

1 Ответ

0 голосов
/ 16 марта 2019
  1. Вы используете XmlSlurper для создания node из n. Но вы должны использовать XmlParser, как вы уже используете в строке выше
  2. Вы также должны использовать it.parent().append(node) в строке с nodes.each { it.parent().appendNode(node) }

После применения этих двух изменений все будет работать так, как вы ожидаете

...