Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML节点替换为节点的另一个实例_Xml_Groovy - Fatal编程技术网

将XML节点替换为节点的另一个实例

将XML节点替换为节点的另一个实例,xml,groovy,Xml,Groovy,我使用groovy来解析XML文件。使用点表示法,我可以接收所需的节点作为实例 对于我的用例,一个节点被克隆、编辑并在编辑结束后替换原始节点 Node对象有一个实现的,它需要一个闭包,包含以下文档: 将当前节点替换为使用生成器样式定义的节点 通过闭包表示法 @参数c使用生成器样式定义新节点的闭包 符号 我的问题是,如何将一个节点实例替换为另一个节点实例? 这就是我现在所做的,当然不起作用: Node referenceNode Node editedNode referenceNode.repl

我使用groovy来解析XML文件。使用点表示法,我可以接收所需的节点作为实例

对于我的用例,一个节点被克隆、编辑并在编辑结束后替换原始节点

Node对象有一个实现的,它需要一个闭包,包含以下文档:

将当前节点替换为使用生成器样式定义的节点 通过闭包表示法

@参数c使用生成器样式定义新节点的闭包 符号

我的问题是,如何将一个节点实例替换为另一个节点实例? 这就是我现在所做的,当然不起作用:

Node referenceNode
Node editedNode
referenceNode.replaceNode {
    editedNode
}
由于
plus()
方法也排除了相同的语法,这对我来说有点困难


这里有一个使用XmlSlurper解决的与的相关问题,我不想这样做:

只需使用要替换它的节点调用
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)
导入groovy.xml* def xml='' A. B C ''' parser=new XmlParser().parseText(xml) Node newNode=解析器。用户[2]。克隆() newNode@something='woo' parser.user[1].replaceNode(newNode) println XmlUtil.serialize(解析器) 上面印着:

<?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>

A.
C
C

我真的觉得自己很愚蠢,因为我没有尝试过这个;)非常感谢您的回复。我明天会测试这个,并给你一个检查作为反馈:)再次感谢!别担心:-)希望我能帮忙!不幸的是,这为我抛出了一个异常
没有方法签名:groovy.util.Node.replaceNode()适用于参数类型:(groovy.util.Node)值:[user[attributes={something=woo};value=[name[attributes={};value=[c]\\\\\\\\\\\\]]可能的解决方案:replaceNode(groovy.lang.Closure)
问题可能是我的旧grails版本2.3.11Odd。。。我将在添加时查看…谢谢您的时间。你完全正确。我将把这个答案标记为正确的,因为它在更新版本的groovy中被更正了。现在,我通过在我的服务中实现一个私有助手方法来解决我的问题,该方法主要完成以下任务:
replaced.children().toArray().each{replaced.remove(it)}node.children().each{replaced.append(it)}
,并更改属性。