【问题标题】:XmlSlurper in Groovy Script --- Insert nodes to GpathResult using external closuresGroovy 脚本中的 XmlSlurper --- 使用外部闭包将节点插入 GpathResult
【发布时间】:2013-10-02 06:56:58
【问题描述】:

我对以下场景有疑问:

-- 我有一个 GPathResult “body”,我想在其中附加一些 xml(节点和子节点) -- 有些部分很常见,所以我试图将它们保存在外部封闭“commonNode”中,我可以在任何需要的地方插入

// some more code here to get body

def commonNode = {
return {
  node2() {
     child("childValue")
   }
 }
}

body.appendNode(
 {
   node1("value1")
   commonNode()
   node3("value3")
 }
)

在调用 XmlUtil.serialize(body) 之后我想得到的是:

...
 <body>
  <node1>value</node1>
  <node2>
   <child>childValue</child>
  </node2>
  <node3>value3</node3>
 <body>
...

但是结果中完全没有结构,所以我猜我将外部闭包称为“commonNode()”的方式有问题。

希望有人能给出答案。如果您需要更多详细信息,请告诉我。

【问题讨论】:

    标签: groovy closures gpath


    【解决方案1】:

    这行得通:

    import groovy.xml.*
    
    def xml = '<body/>'
    
    def body = new XmlSlurper().parseText( xml )
    
    def commonNode = { 
        node2 {
            child "childValue"
        }
    }
    
    body.appendNode { 
        node1 "value1"
        commonNode.delegate = delegate
        commonNode()
        node3 "value3"
    }
    
    println XmlUtil.serialize( body )
    

    【讨论】:

    • 提示和有用的答案。我还有一个额外的好奇心:我的语法和你的语法之间是否存在功能差异:child("childvalue") 与 child "childValue" 相比?
    • @Shinoko 不,是一样的 :-) 这种情况下的括号是可选的 :-)
    • 也可以有参数吗?例如,调用闭包时要作为字符串发送的子节点的值(“childValue”)。需要更改哪些代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    相关资源
    最近更新 更多