2016-09-19 7 views
2

Хотя на этот вопрос можно ответить на других языках программирования, я чувствую, что его нет в Scala.Как прекрасно представлять объект XML в классе Scala?

Я хотел бы использовать четкую DSL, которая представляет следующий пример XML в классе Scala, чтобы я мог легко использовать его в моей XML-системе REST (play).

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

Это не домашнее задание, я пытаюсь написать приложение в игре, чтобы перевести из одной компании внутреннего покоя промышленный стандарт. (Если кому-то интересно, это формат XML OpenCable ESNI vI02)

Мой вопрос: Я правильно представлял атрибуты «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.

Имея это, вы можете легко использовать некоторые идиоматическое 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

 Смежные вопросы

  • Нет связанных вопросов^_^