内StreamingMarkupBuilder()使用字符串变量绑定{}在Groovy
问题描述:
为下面的代码:内StreamingMarkupBuilder()使用字符串变量绑定{}在Groovy
def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){MyTag('Help Me')}
}
println(writer.toString())
the output would be: <Project><MyTag>Help Me</MyTag></Project>
现在,如果我有“MyTag(‘帮我’)”在上面的代码作为一个字符串VAR和希望如下图所示
def teststring = "MyTag('Help Me')"
def writer = new StringWriter()
writer = new StreamingMarkupBuilder().bind {
Project(){out<<teststring}
}
println(writer.toString())
the output am getting is: MyTag('Help Me')<Project></Project>
but am expecting: <Project><MyTag>Help Me</MyTag></Project>
是新来的常规使用,任何人帮我正确执行或找到上述情况的错误呢?请让我知道如果我不得不使用StreamingMarkupBuilder和XmlMarkupBuilder以外的其他类吗? 请注意,在我的实际场景中,文本变量实际上包含更多嵌套的子节点。
答
你可以做这样的事情;包裹节点串入一个{ -> }
并评估它作为一个封闭,然后设置委托并调用关闭:
import groovy.xml.*
def nodes = '''MyTag(attr:'help me') {
| AnotherTag('Help me!')
|}'''.stripMargin()
println XmlUtil.serialize(new StreamingMarkupBuilder().bind {
Project {
c = Eval.me("{ -> $nodes }")
c.delegate = delegate
c()
}
})
它打印:
<?xml version="1.0" encoding="UTF-8"?><Project>
<MyTag attr="help me">
<AnotherTag>Help me!</AnotherTag>
</MyTag>
</Project>
但是,你一定要小心,因为如果这个nodes
字符串来自你的系统之外,它可以用来执行放入它的任何代码。
如果您正在获取字符串中的节点,为什么不让他们写XML而是为您节省一份工作? ;-)
+0
嘿蒂姆谢谢!你的两个解决方案都工作(第二个是建议),但对于我生成节点文本的方式,我觉得第一种方法允许我编写更多可读代码。 但我仍然在想,如果我在执行某处出错了,逻辑上让节点写入XML应该很容易。 –
在此先感谢。 –