2013-10-21 45 views
1

我希望setEscapeAttributes(Boolean)方法打開和關閉轉義特殊字符,即當我將構建器內容轉換爲字符串時,特殊字符將有所不同,具體取決於我們輸入該方法的值。但是,似乎我的期望不正確,或者方法不正常。下面是一個例子片段:MarkupBuilder的setEscapeAttributes不工作?

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> 

那麼,wha t正在發生?我正在使用groovy 2.1.8,這是本文的最新版本。

回答

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(作爲'
未閉)

+0

大!非常感謝。 – JBT