【问题标题】:Replace XML Node with another instance of Node用另一个 Node 实例替换 XML Node
【发布时间】:2016-04-04 17:03:52
【问题描述】:

我使用 groovy 来解析一个使用 XmlParser 的 XML 文件。使用点符号我可以接收所需的节点作为Node 实例。

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

Node 对象实现了一个 replaceNode,它需要一个闭包,并附有以下文档:

用构建器样式定义的节点替换当前节点 通过闭包表示。

@param c 使用 builder-style 定义新节点的闭包 符号。

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

这就是我现在所做的,当然这是行不通的:

Node referenceNode
Node editedNode
referenceNode.replaceNode {
    editedNode
}

由于plus() 方法也期望相同的语法,这对我来说有点困难。

这是一个使用 XmlSlurper 解决的相关问题,我不想这样做:Groovy: Node.replaceNode with Node?

【问题讨论】:

    标签: xml groovy


    【解决方案1】:

    只需使用您要替换的节点调用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>
    

    【讨论】:

    • 我真的因为没有尝试过而感到愚蠢;)非常感谢您的回复。我明天会测试这个并给你一个检查作为反馈:) 再次感谢!
    • 别担心 :-) 希望我能帮上忙!
    • 遗憾的是这对我抛出了一个异常No signature of method: groovy.util.Node.replaceNode() is applicable for argument types: (groovy.util.Node) values: [user[attributes={something=woo}; value=[name[attributes={}; value=[c]]]]] Possible solutions: replaceNode(groovy.lang.Closure) 也许问题是我的旧 grails 版本 2.3.11
    • 奇怪...我会在添加 docs.groovy-lang.org/latest/html/api/groovy/util/… 时查看...
    • 感谢您的宝贵时间。你是绝对正确的。我会将这个答案标记为正确,因为它已在较新版本的 groovy 中得到纠正。现在我通过在我的服务中实现一个私有辅助方法解决了我的问题,该方法主要执行此操作:replaced.children().toArray().each { replaced.remove(it) } node.children().each { replaced.append(it) } 并更改属性。
    猜你喜欢
    • 2016-01-13
    • 2016-05-22
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多