[英]How to convince groovy.xml.MarkupBuilder to create a node whose name is 'use'
[英]how to create xml document with special node names with groovy markupbuilder
我正在用groovy markupbuilder构建一个蚂蚁脚本。 不幸的是,markupbuilder不允许我创建名称为“ target”的节点(targetee没问题),因为它抛出了我
Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.call() is applicable for argument types: (java.util.LinkedHashMap, BuildGen$_main_closure1_closure5) values: [[name:clean], BuildGen$_main_closure1_closure5@18efaea]
Possible solutions: wait(), any(), trim(), split(), dump(), next()
因此,在我的markupbuilder中,此代码段有效:
targete(name: 'clean') {
delete(dir: rootProj.compilerOutput)
}
但我想通过“目标”节点实现相同的目标。
我设法通过以下方式创建了一个空的“目标”节点:
builder.invokeMethod('target', [name: 'clean'])
但是如何继续在这个“目标”节点中放置更多节点?
工作代码示例:
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.project(name: projectName, basedir:'.') {
// works with 'target2' but not with 'target'
'target2'(name: 'build-subprojects') {
rootProj.getAllDependentProjects().each { p->
echo(message: "Compiling project: ${p.projectName}")
// some real stuff
}
}
如果我猜对了,那么您的问题是您要创建具有Groovy关键字名称的节点吗?
如果是这样,则只需将名称加上引号即可,如下所示:
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder( writer )
builder.project {
'for'(name: 'clean') {
delete(dir: '.')
}
}
println writer
该代码段将打印出来:
<project>
<for name='clean'>
<delete dir='.' />
</for>
</project>
对我来说,这有效:
def projects = [ 'pro_one', 'pro_two' ]
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.project( name: 'test', basedir:'.' ) {
'target'( name: 'build-subprojects' ) {
projects.each { p ->
echo( message: "Compiling project: ${p}" )
}
}
}
println writer.toString()
在调用此代码之前,是否已将target
设置为代码中的任何内容?
您可以尝试:
builder.target( name: 'build-subprojects' ) {
那可能更好?
我已经尝试过Groovy 1.7.5和1.8 beta 2,但无法使其失败:-/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.