Я пытаюсь заменить один узел, содержащий 3 подузла, новым узлом, содержащим 2 подузла.
Функция replaceNode (http://docs.groovy -lang.org / latest / html / api /groovy / util / slurpersupport / GPathResult.html ) принимает только Closure, а не такой объект, как replaceBody.
Однако replaceBody заменяет тело узла, а не фактический узел.
Я сделал упрощенный пример, который можно запустить в https://groovyconsole.appspot.com/
import groovy.util.slurpersupport.*;
import groovy.xml.XmlUtil;
class swarco_updated_example_replace_node_test_simple {
static void main(def args){
/* Overlapping entries */
String xmlorg3entries = '''
<map>
<value>
<!-- Overlapping registrations -->
<map>
<name>blabla</name>
<fruits>
<map>
<type>pear</type>
<color>green</color>
</map>
<map>
<type>orange</type>
<color>orange</color>
</map>
<map>
<type>cherry</type>
<color>red</color>
</map>
</fruits>
</map>
</value>
</map>
''';
String xmlreplace2entries = '''
<fruits>
<map>
<type>grapes</type>
<color>green</color>
</map>
<map>
<type>apples</type>
<color>green</color>
</map>
</fruits>
''';
printNodeReplace(xmlorg3entries, xmlreplace2entries);
}
static def printNodeReplace(mainNodeAsString, insertNodeAsString){
//https://stackoverflow.com/questions/30352052/inserting-xml-snippet-into-another-xml-document-in-groovy
def bodyNode = new XmlSlurper( false, false, false ).parseText( mainNodeAsString );
def fragmentNode = new XmlSlurper( false, false, false ).parseText( insertNodeAsString );
//fails
//bodyNode.value.map.fruits.replaceNode(fragmentNode);
bodyNode.value.map.fruits.replaceBody(fragmentNode);
println XmlUtil.serialize(bodyNode);
}
}
Результатом является дублированный узел.Как правильно это сделать?Очистить существующий узел и использовать добавление для каждой записи?
<?xml version="1.0" encoding="UTF-8"?><map>
<value>
<map>
<name>blabla</name>
<fruits>
<fruits>
<map>
<type>grapes</type>
<color>green</color>
</map>
<map>
<type>apples</type>
<color>green</color>
</map>
</fruits>
</fruits>
</map>
</value>
</map>