Groovy: заменить один узел XML другим - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь заменить один узел, содержащий 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>

1 Ответ

0 голосов
/ 14 февраля 2019

используйте fragmentNode.children() для добавления детей fragmentNode

bodyNode.value.map.fruits.replaceBody(fragmentNode.children());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...