内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以外的其他类吗? 请注意,在我的实际场景中,文本变量实际上包含更多嵌套的子节点。

+0

在此先感谢。 –

你可以做这样的事情;包裹节点串入一个{ -> }并评估它作为一个封闭,然后设置委托并调用关闭:

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应该很容易。 –