我试图用一个包含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>
答案 0 :(得分:1)
使用fragmentNode.children()
附加fragmentNode
的子代
bodyNode.value.map.fruits.replaceBody(fragmentNode.children());