【问题标题】:Play 1.2.4 : Rendering XML in template播放 1.2.4 : 在模板中渲染 XML
【发布时间】:2011-12-19 18:05:49
【问题描述】:

我最近升级到 Play 1.2.4,我相信以下票证的错误修复对我的一些代码产生了负面影响:

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

我相信上面实现的修复会从 XML 字符串中转义所有 HTML 实体 - 包括实际的 XML 结构本身。

所以<someXml/> 变成了<someXml/>

我遇到的问题是我使用模板将 XML 作为 API 调用提供服务,因此 XML 被转义返回给调用者,因此无用。

我尝试过使用:

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

和:

${ anObject.someXml.raw() } 

获取原始格式的 XML,但这不起作用。

可以在groovy template__safeFaster 方法(第 400 行)中找到导致此问题的代码部分。

有谁知道我可以绕过这个新功能的方法吗?

【问题讨论】:

    标签: java xml templates groovy playframework


    【解决方案1】:

    正如上面问题中所讨论的,问题的原因在于__safeFaster 方法 - 或者更具体地说,该行:

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

    为了解决这个问题,我们在相应的控制器中将响应 content-type 设置为 text/xml,并将模板扩展名更改为 .txt

    希望 Play 的开发者能在他们的下一个版本中解决这个问题。

    【讨论】:

      【解决方案2】:

      如果您尝试呈现 XML 字符串,可以使用 play.mvc.Controller 中的 renderXml 方法在浏览器中显示格式化的 XML。

      我通过将此行添加到我的 conf/routes 文件中进行了测试:

      # 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);
      }
      

      希望这会有所帮助!

      【讨论】:

      • 感谢您的回答-我实际上是在使用模板来使用一些对象构建 XML 文件(这是最简单的方法)-因此我无法在此渲染 XML方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2012-06-03
      • 2022-01-14
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多