在Scala中编组/解组XML

Aar*_*rup 15 xml scala marshalling unmarshalling

我正在研究Scala和XML之间的编组/解组数据的各种方法,我有兴趣获得社区反馈(最好以第一手知识/经验为基础).

我们目前正在使用JAXB,这很好,但我希望有一个纯Scala解决方案.我正在考虑以下方法:

  1. 使用Scala的内置XML工具:Scala-> XML会很简单,但我的猜测是另一个方向会相当痛苦.另一方面,这种方法支持任意翻译逻辑.

  2. 数据绑定:scalaxb目前似乎有些不成熟,并且不处理我们当前的模式,我不知道Scala的任何其他数据绑定库.与JAXB一样,需要额外的转换层来支持相关的转换.

  3. XML pickler组合器:GData Scala Client库提供XML pickler组合器,但是最近的项目活动一直很少,我不知道当前状态是什么.

问题:

  1. 您对我列出的方法/库有什么经验?
  2. 每个的相对优势和劣势是什么?
  3. 我还应该考虑其他方法或Scala库吗?

编辑:

我在自己对这个问题的回答中添加了关于我对pickler组合器的早期印象的一些注释,但我仍然对那些真正了解各种方法的人的反馈非常感兴趣.我希望的是一个有点全面的比较,可以帮助开发人员选择适合他们需求的方法.

Dav*_*vid 5

我建议使用Scala的内置XML功能.我刚刚为文档结构实现了反序列化,如下所示:

val bodyXML = <body><segment uri="foo"><segment uri="bar" /></segment></body>
Run Code Online (Sandbox Code Playgroud)

请注意,段可以彼此嵌套.

细分如下实施:

case class Segment(uri: String, children: Seq[Segment])
Run Code Online (Sandbox Code Playgroud)

要反序列化XML,请执行以下操作:

val mySegments = topLevelSegments(bodyXML)
Run Code Online (Sandbox Code Playgroud)

......而实现topLevelSegments只是几行代码.注意递归,它遍历XML结构:

def topLevelSegments(bodyXML: Node): Seq[Segment] = 
    (bodyXML \ "segment") map { nodeToSegment }

def nodeToSegment = (n: Node) => Segment((n \ "@uri")(0) text, childrenOf(n))

def childrenOf(n: Node): Seq[Segment] = (n \ "segment") map { nodeToSegment }
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.

  • 但是,您混合到代码库中的任何其他技术都会带来开销:学习语法,要解密的一组错误消息,要加入的用户组,可能需要进行部署调整."活动部件"越少越好. (2认同)