Groovy:用另一个替换一个XML节点

时间:2019-02-14 18:21:49

标签: groovy

我试图用一个包含2个子节点的新节点替换一个包含3个子节点的节点。

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

}

结果是重复的节点。正确的方法是什么?清除现有节点并为每个条目使用append吗?

<?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 :(得分:1)

使用fragmentNode.children()附加fragmentNode的子代

bodyNode.value.map.fruits.replaceBody(fragmentNode.children());