Jerkson делает Scala JSON таким простым, может ли быть то же самое для XML? - PullRequest
2 голосов
/ 02 марта 2012

По общему признанию, я действительно люблю библиотеку Jerkson, потому что она делает генерацию JSON очень простой. Возьмем для примера:

Json(generate(Job.search(parseDate(date),accountId)
      .map(job => Map("id" -> job.id,
      "name" -> job.name,
      "userId" -> job.userId.getOrElse("")
    ))))

Но мне трудно найти подобную библиотеку, которая могла бы генерировать и сериализовать узлы XML и т. Д., Так же легко, как эта. Существует ли библиотека Java или Scala, которая могла бы генерировать узлы и значения в простом синтаксисе без необходимости создавать «шаблоны» или вручную писать узлы?

Ответы [ 4 ]

3 голосов
/ 03 марта 2012

Сложнее построить XML, чем JSON, из-за «двойной иерархии» атрибутов и дочерних узлов. Структура JSON легко представлена ​​стандартными коллекциями Scala с помощью вложенных карт и списков.

Но если вас просто интересует подмножество XML, проблемы менее сложны. Согласно вашему ответу на мой комментарий, следующий фрагмент может быть достаточно для того, что вам нужно:

def tag( name: String, content: Seq[Node] ): Node =
  <xml></xml>.copy( label = name, child = content )

def toXML( label: String, content: String ): Node =
  tag( label, Text( content ) ) 

def toXML( root: String, map: Map[_,_] ): Node = {
  val children = for( (k,v) <- map ) yield {
    v match {
      case m: Map[_,_] => toXML( k.toString, m )
      case a => toXML(k.toString, a.toString )
    }
  }
  tag( root, children.toSeq )
}

Работает как положено. Например:

 val data = Map(
  "id" -> 121,
  "foo" -> Map(
    "hoo" -> "bar",
    "goo" -> "baz"
  )
)

val xml = convert.toXML( "example", data )

Тогда xml будет равно:

<example>
  <id>121</id>
  <foo>
    <hoo>bar</hoo>
    <goo>baz</goo>
  </foo>
</example>

Это просто быстрый и грязный хак, но я думаю, что его можно легко улучшить (например, включить списки) и сделать более безопасным.

1 голос
/ 08 марта 2012

На самом деле есть библиотека, которая делает это (только не через Scala Xml) - Scales Xml обеспечивает именно такой тип построения DSL:

val ns = Namespace("test:uri")
val nsa = Namespace("test:uri:attribs")
val nsp = nsa.prefixed("pre")

val builder = 
  ns("Elem") /@ (nsa("pre", "attr1") -> "val1",
               "attr2" -> "val2",
       nsp("attr3") -> "val3") /(
    ns("Child"),
    "Mixed Content",
    ns("Child2") /( ns("Subchild") ~> "text" )
  )

См. здесь для получения более подробной документации

1 голос
/ 02 марта 2012

Вы можете использовать встроенный XML в Scala:

val someNode = <root>
                   <child>
                       Some stuff goes here
                   </child>
               </root>

someNode \ "child" // returns the child node

someNode \ "child" text // returns the text of the child node
1 голос
/ 02 марта 2012

Знаете ли вы, что XML является нативным типом в Scala?Вы можете просто вернуть XML сразу, библиотека не нужна.

См. this для примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...