使用groovy.xml.MarkupBuilder语法追加到现有的groovy.util.Node?

时间:2010-08-10 17:10:28

标签: xml groovy

我正在使用返回groovy.util.Node的API,允许我自定义其生成的XML。我需要将一个子元素附加到Node中,我想知道我是否可以使用MarkupBuilder语法来修改Node。

例如,这里的东西有效,但看起来很笨拙:

withXml { rootNode ->
    def appendedNode = new Node(rootNode, 'foo', [name:'bar'])
    def appendedNodeChild = new Node(appendedNode, 'child', [blah:'baz'])
}

有没有办法使用MarkupBuilder-ish语法附加到rootNode?感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用groovy.util.Node的appendNode方法:

withXml { rootNode ->
    rootNode.appendNode ('foo', [name: 'bar']).appendNode ('child', [blah: 'baz'])
}

以上代码段将添加添加

<foo name="bar">
    <child blah="baz"/>
</foo>

到rootNode。

答案 1 :(得分:1)

结帐groovy.util.Node的javadoc,发现了两种方法&#39;关闭&#39;作为参数:

  • void plus(Closure c)
  • Node replaceNode(Closure c)

所以,你可以用它们做点什么。 这是一个spring boot项目的build.gradle示例代码:

publishing {
    publications {
        mavenJava(MavenPublication) {
            from components.java

            pom.withXml {
                ((groovy.util.Node) asNode()).children().first() + {
                    setResolveStrategy(Closure.DELEGATE_FIRST)
                    parent {
                        groupId 'org.springframework.boot'
                        artifactId 'spring-boot-starter-parent'
                        version "${springBootVersion}"
                    }
                    description 'A demonstration of maven POM customization'
                }
            }
        }
    }
}

答案 2 :(得分:0)

new MarkupBuilder().root {
   foo( name:'bar' ) {
     child( blah:'blaz' )
   }
 }

不知道我是否完全理解你的问题,但我相信你可以做上面的事情

此文档中的此示例还显示了如何使用yield添加其他内容

http://groovy.codehaus.org/api/groovy/xml/MarkupBuilder.html