如何使用scala.xml和Play Framework编写<! - ?xml - >标记

时间:2014-08-31 20:23:04

标签: xml scala playframework

有谁能告诉我如何写&#34; xml&#34;标记到输出?正如所料,loadString()方法在加载时摆脱它。

object SitemapController extends Controller {

  def validDeals = Action { implicit request =>
    val xmlStr = "<?xml version="1.0" encoding="UTF-8"?><msg>There's no xml tag</msg>" 
    Ok( scala.xml.XML.loadString(xmlStr) )
  } 
}

我从控制器得到的只是

<msg>There's no xml tag</msg>

2 个答案:

答案 0 :(得分:3)

OKStatus,它使用Writable类型类将内容编码为字节(see Status.apply)。查看源here,xml节点的Writable只调用toString。基本上,您只需获取根节点的字符串表示形式,而不是具有xml声明的文档。

要获得decl,您需要使用XML.write()java.io.Writer以及其他参数调用xmlDecl = true。 (我能够为DocType提供null,而不是发明一个。

你可以写一个StringWriter然后发送它,但我认为最有效的方法(特别是如果你的文档很大)将为Writable创建一个隐式xml.Node来覆盖内置之一。

答案 1 :(得分:0)

Play处理XML非常愚蠢。 M.B。没有多少用过它? 无论如何,这里是可写的,形成适当的xml文档,也修剪空格。 只需将其导入控制器即可。

 object Implicits {    
    implicit def writeableOf_Node(implicit codec: Codec): Writeable[NodeSeq] = {
      Logger.debug(s"Codec: $codec")
      Writeable{ xml => {
        val stringWriter = new StringWriter(1024)
        val node = scala.xml.Utility.trim(xml(0))
        scala.xml.XML.write(stringWriter, node, codec.charset, xmlDecl = true, null)
        val out = codec.encode(stringWriter.toString)
        stringWriter.close()
        out
      }}
    }
    }
相关问题