2016-09-19 22 views
2

虽然这个问题可以用其他编程语言来解答,但我觉得它从Scala中错过了。如何精美地表示一个Scala类中的XML实体?

我想要使用清晰的DSL代表Scala类中的以下示例XML,以便我可以在REST(play)框架的XML中轻松使用它。

<?xml version="1.0" encoding="UTF-8"> 
<requests> 
    <request type="foo" id="1234"> 
    <recipient>bar<recipient> 
    <recipient>baz<recipient> 
    <body>This is an example string body</body> 
    <ext>Optional tag here like attachments</ext> 
    <ext>Optional too</ext> 
    </request> 
</requests> 

这里是我试图表现在斯卡拉类上面的模型:

class Attribute[G](
    value:G 
) 

class Request(
    type: Attribute[String], 
    id: Attribute[Integer], 
    recipient[List[String]], 
    body: String, 
    ext: Option[List[String]] // Some or None 
) 

// how it's used 
val requests = List[Request] 

这不是功课,我试着写剧本的应用程序翻译从一个公司内部的其余部分一个行业标准之一。 (如果有人很好奇,这是OpenCable ESNI vI02 XML格式)

我的问题:我是否正确表示“foo”和“id”属性?如果是这样,我怎么会轻松输出XML没有太多的按摩或粗糙的字符串插值。我希望foo和id被解释为属性而不是嵌套标签,如下所示:

...<request><type>foo</type><id>1234</id>...DO NOT WANT 

谢谢!

回答

2

XML标签是Scala中的第一类公民,可以让您以比其他语言更清晰的方式使用标签。

从Scala 2.11起,XML Library已被提取到its own package

有了这样的,你可以很容易地使用一些惯用的Scala实现自己的目标:

case class Request(requestType: String, id: Int, recipients: List[String], body: String, ext: Option[List[String]]){ 

     def toXML = 
     <requests> 
      <request type={requestType} id={id}> 
       {recipientsXML} 
       <body>{body}</body> 
       {extXML} 
      </request> 
     </requests> 

     private def recipientsXML = 
     recipients.map(rec => <recipient>{rec}</recipient>) 
     private def extXML = for { 
     exts <- ext 
     elem <- exts 
     } yield <ext>{elem}</ext> 
} 
+0

你忘了XML标记周围双引号的高清toxml用于? – dlite922

相关问题