MarkupBuilder的setEscapeAttributes不起作用?

时间:2013-10-21 05:18:47

标签: groovy

我希望setEscapeAttributes( Boolean )方法可以打开和关闭转义的特殊字符,也就是说,当我将构建器内容转换为字符串时,特殊字符将会有所不同,具体取决于我们提供给该方法的值。但是,似乎我的期望不对或方法不正常。以下是一个示例代码段:

foo.groovy

import groovy.xml.*
def writer = new StringWriter()
def builder = new MarkupBuilder( writer )
println builder.isEscapeAttributes()
builder.setEscapeAttributes( false )
println builder.isEscapeAttributes()
builder.html {
    h2 "hello<br>world"
}

println writer.toString()

如果您运行groovy foo.groovy,则输出结果为:

true
false
<html>
  <h2>hello&lt;br&gt;world</h2>
</html>

我期望h2

<h2>hello<br>world</h2>

那么,发生了什么?我正在使用groovy 2.1.8,这是撰写本文时的最新版本。

1 个答案:

答案 0 :(得分:6)

使用setEscapeAttributes会阻止它转义attributes,所以:

println new StringWriter().with { writer ->
    new MarkupBuilder( writer ).with {

        // Tell the builder to not escape ATTRIBUTES
        escapeAttributes = false

        html {
            h2( tim:'woo>yay' )
        }
        writer.toString()
    }
}

将打印:

<html>
  <h2 tim='woo>yay' />
</html>

相反,如果你注释掉上面的escapeAttributes行:

<html>
  <h2 tim='woo&gt;yay' />
</html>

如果您想避免转义内容,则需要使用mkp.yieldUnescaped,如下所示:

println new StringWriter().with { writer ->
    new MarkupBuilder( writer ).with {
        html {
            h2 {
                mkp.yieldUnescaped 'hello<br>world'
            }
        }
        writer.toString()
    }
}

将打印:

<html>
  <h2>hello<br>world</h2>
</html>

虽然应该小心,因为这显然是无效的xml(因为“未关闭”)