用另一个节点实例替换XML节点

3
我使用Groovy和XmlParser解析XML文件。使用点符号表示法,我可以将所需的节点作为Node实例接收到。
对于我的用例,一个节点被克隆、编辑并在编辑结束后替换原始节点。
Node对象有一个replaceNode方法,它期望一个闭包,并具有以下文档:

使用构建器样式符号通过闭包将当前节点替换为定义的新节点。

@param c 使用构建器样式符号定义新节点的一个闭包。

我的问题是,如何将一个节点实例替换为另一个节点实例?

这是我现在正在做的事情,当然不起作用:
Node referenceNode
Node editedNode
referenceNode.replaceNode {
    editedNode
}

作为plus()方法也期望相同的语法,这对我来说有些困难。
这里有一个相关的问题,使用XmlSlurper解决了,但我不想这样做:Groovy: Node.replaceNode with Node?
1个回答

4

只需使用要替换的节点调用replaceNode

import groovy.xml.*

def xml = '''
<root>
    <user><name>a</name></user>
    <user><name>b</name></user>
    <user><name>c</name></user>    
</root>'''

parser = new XmlParser().parseText(xml)

Node newNode = parser.user[2].clone()
newNode.@something = 'woo'
parser.user[1].replaceNode(newNode)

println XmlUtil.serialize(parser)

这将打印:

<?xml version="1.0" encoding="UTF-8"?><root>
  <user>
    <name>a</name>
  </user>
  <user something="woo">
    <name>c</name>
  </user>
  <user>
    <name>c</name>
  </user>
</root>

我真的感觉很愚蠢,没有尝试过这个;)非常感谢您的回复。我明天会测试一下,并给您反馈:)再次感谢! - Nico O
没问题 :-) 希望我能帮到你! - tim_yates
1
很遗憾,这对我来说抛出了一个异常:“groovy.util.Node.replaceNode()”方法没有签名适用于参数类型:“(groovy.util.Node)”,值为:[user [attributes = {something = woo}; value = [name [attributes = {}; value = [c]]]]] 可能的解决方案是:replaceNode(groovy.lang.Closure)。也许问题在于我的旧版Grails版本2.3.11。 - Nico O
奇怪...我会查一下http://docs.groovy-lang.org/latest/html/api/groovy/util/Node.html#replaceNode(groovy.util.Node)是什么时候添加的... - tim_yates
感谢您的时间。您说得完全正确。我会将此答案标记为正确,因为在新版本的Groovy中已经进行了更正。目前,我通过在我的服务中实现一个私有辅助方法来解决了我的问题,该方法主要执行以下操作:replaced.children().toArray().each { replaced.remove(it) } node.children().each { replaced.append(it) }并且还修改了属性。 - Nico O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接