0

对于以下代码:

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('Help Me')”作为字符串 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>

是 groovy 的新手,有人帮助我正确实施或找到上述案例的错误吗?如果我必须使用 StreamingMarkupBuilder 和 XmlMarkupBuilder 以外的其他类,请告诉我?请注意,在我的实际场景中,文本变量实际上包含更多嵌套的子节点。

4

1 回答 1

0

你可以做这样的事情;将节点字符串包装成 a{ -> }并将其评估为闭包,然后设置委托并调用闭包:

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>

但是,您必须小心,就好像该nodesString 来自您的系统外部一样,它可用于执行放入其中的任何代码。

如果您在 String 中获取节点,为什么不让它们改为编写 XML 并为您节省一份工作呢?;-)

于 2014-02-06T09:11:34.377 回答