2014-08-31 2 views
2

Может ли кто-нибудь сказать мне, как написать тег «xml» на выходе? Как и ожидалось, метод loadString() избавляется от него во время загрузки.Как написать тег <?xml> с помощью scala.xml и Play Framework

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

Что я получаю Beck от контроллера просто

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

ответ

2

OK является Status, который использует Writable для кодирования класса типов содержимого в байтах (see Status.apply). Глядя на источник here, Writable для узлов xml просто вызывает toString. В принципе, вместо документа с объявлением xml вы просто получаете строковое представление корневого узла.

Чтобы получить декларацию необходимо позвонить по телефону XML.write() с помощью java.io.Writer и xmlDecl = true, а также с другими параметрами. (Я смог предоставить null для DocType, вместо того, чтобы изобретать один).

Вы можете написать StringWriter, а затем отправить его, но я думаю, что наиболее эффективным способом (особенно если ваш документ является большой) было бы создание неявного Writable для xml.Node, чтобы переопределить встроенный.

0

Игра очень глупа в обработке XML. М.Б. не многие использовали его? В любом случае, здесь можно записать, что форма надлежащего 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 
     }} 
    } 
    } 
Смежные вопросы