Aar*_*rup 15 xml scala marshalling unmarshalling
我正在研究Scala和XML之间的编组/解组数据的各种方法,我有兴趣获得社区反馈(最好以第一手知识/经验为基础).
我们目前正在使用JAXB,这很好,但我希望有一个纯Scala解决方案.我正在考虑以下方法:
使用Scala的内置XML工具:Scala-> XML会很简单,但我的猜测是另一个方向会相当痛苦.另一方面,这种方法支持任意翻译逻辑.
数据绑定:scalaxb目前似乎有些不成熟,并且不处理我们当前的模式,我不知道Scala的任何其他数据绑定库.与JAXB一样,需要额外的转换层来支持相关的转换.
XML pickler组合器:GData Scala Client库提供XML pickler组合器,但是最近的项目活动一直很少,我不知道当前状态是什么.
问题:
编辑:
我在自己对这个问题的回答中添加了关于我对pickler组合器的早期印象的一些注释,但我仍然对那些真正了解各种方法的人的反馈非常感兴趣.我希望的是一个有点全面的比较,可以帮助开发人员选择适合他们需求的方法.
我建议使用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)
希望有所帮助.
| 归档时间: |
|
| 查看次数: |
5074 次 |
| 最近记录: |