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

を使用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 であるため (`が閉じられていないため) 、注意が必要です。

于 2013-10-21T10:31:57.770 に答える