【问题标题】:Using String Variables inside StreamingMarkupBuilder().bind{} in Groovy在 Groovy 中使用 StreamingMarkupBuilder().bind{} 中的字符串变量
【发布时间】:2014-02-06 06:12:31
【问题描述】:

下面的代码:

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

【问题讨论】:

    标签: xml groovy streamingmarkupbuilder


    【解决方案1】:

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

    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 String 来自你的系统之外,它可以用来执行任何放入其中的代码。

    如果您要获取字符串中的节点,为什么不让它们编写 XML 来代替您节省一份工作呢? ;-)

    【讨论】:

    • 嘿,蒂姆,谢谢!您的两个解决方案都有效(第二个是建议),但是对于我生成节点文本的方式,我觉得第一种方法允许我编写更具可读性的代码。但我仍然在想,如果我在某个地方的实现出错了,逻辑上让节点写成 XML 应该很容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多