2011-12-19 70 views
1

渲染XML我最近升級到1.2.4播放,我相信以下票bug修復已經對我的一些代碼產生負面影響:播放1.2.4:在模板

https://play.lighthouseapp.com/projects/57987/tickets/549-play-rest-xml-rendering-of-html-entities-issue

我相信上面實現的修復從XML字符串中轉義所有HTML實體 - 包括實際的XML結構本身。

所以<someXml/>成爲&lt;someXml/&gt;

,我遇到的問題是,我使用模板來服務作爲XML API調用,所以在XML返回給調用者逃脫,因此是無用的。

我已經嘗試使用:

#{verbatim} ${ anObject.someXml } #{/verbatim} 

和:

${ anObject.someXml.raw() } 

獲得RAW格式的XML,但這不起作用。

導致此問題的部分代碼可在groovy template__safeFaster方法(第400行)中找到。

有沒有人知道我可以解決這個新功能的方法?

回答

2

正如在問題上面所討論的,這個問題的原因是在__safeFaster方法 - 或更具體地,行:

if (template.name.endsWith(".xml")) 
    return StringEscapeUtils.escapeXml(val.toString()); 

要解決這個問題,我們正在設置響應content-typetext/xml在相應的控制器中並將模板擴展名更改爲.txt

希望Play的開發人員在下一個版本中解決這個問題。

1

如果您嘗試渲染XML字符串,則可以使用play.mvc.Controller中的renderXml方法在瀏覽器中顯示格式化的XML。

# Render XML 
GET /renderXml Application.renderXml(format:'xml') 

然後創建在Application.java此方法,用於讀取XML文件,並使得它(使用Guava I/O)::

public static void renderXml() throws FileNotFoundException, IOException {  
    File xmlFile = new File("app/models", "xmlFile.xml"); 
    InputSupplier<InputStreamReader> inReader = Files.newReaderSupplier(xmlFile, Charsets.UTF_8); 
    List<String> lines = CharStreams.readLines(inReader); 

    String outputXml = ""; 

    for (String line : lines) { 
     outputXml += line; 
    } 

    renderXml(outputXml); 
} 

我通過加入這一行到我CONF /路由文件測試這

希望這有助於!

+0

感謝您的回答 - 我實際上使用模板來使用一些對象來構建XML文件(這是最簡單的方法) - 所以我無法以這種方式呈現XML。 – 2011-12-20 09:40:55