1

我希望该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,这是撰写本文时的最新版本。

4

1 回答 1

6

usingsetEscapeAttributes将阻止它转义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(因为 `
没有关闭)

于 2013-10-21T10:31:57.770 回答