xml - Jerkson 让 Scala JSON 变得如此简单,XML 也能一样吗?

标签 xml scala playframework

诚然,我真的很喜欢 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 库可以用简单的语法生成节点和值,而无需制作"template"或手动编写节点?

最佳答案

由于属性和子节点的“双重层次结构”,构建 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>

这只是一个快速而肮脏的 hack,但我认为它可以很容易地改进(例如包括列表)并变得更安全。

关于xml - Jerkson 让 Scala JSON 变得如此简单,XML 也能一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9528632/

相关文章:

java - 通过Java代码设置按钮位置?

scala - 使用 quasiquotes 从头生成同伴类的正确方法是什么?

performance - scala 隐式性能

Scala/Play 框架 : Passing a view to a view

php - 我们如何在不对 MYSQL 施加任何负载的情况下创建 XML?

xml - XSD 序列选择

javascript - JSON @属性

json - 使用 ScalaJson 序列化解决类型不匹配问题

java - Play Framework : Hashtable in a model?

scala - Play Framework 中指定的基础 docker 镜像在哪里?