2016-09-19 1 views
2

この質問は他のプログラミング言語でも返答されるかもしれませんが、私はScalaからそれが欠落しているような気がします。ScalaクラスのXMLエンティティを美しく表現する方法は?

スカラークラスの次のXMLサンプルを表す明確なDSLを使用して、XML over REST(プレー)フレームワークで簡単に使用できるようにしたいと考えています。

<?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> 

ここではScalaのクラスでは上記のモデルを表現する私の試みです:

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] 

これは私が1つの会社の内部RESTから変換するために劇中のアプリを書くことをしようとしている、宿題ではありません業界標準のものです。 (興味がある人は、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ライブラリはits own packageに抽出されました。あなたが簡単にあなたの目標を達成するために、いくつかの慣用的なスカラ座を使用することができることを持つ

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

あなたはdefのtoXMLでのXMLタグを二重引用符を忘れていますか? – dlite922

関連する問題