gpt4 book ai didi

xml - 在 Scala 中编码/解码 XML

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:01 25 4
gpt4 key购买 nike

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

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

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

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

  3. XML pickler 组合器:GData Scala Client库提供 XML pickler 组合器,但最近的项目事件很少,我不知道当前状态如何。

问题:

  1. 您对我列出的方法/库有何体验?
  2. 各自的相对优势和劣势是什么?
  3. 我应该考虑其他任何方法或 Scala 库吗?

编辑:

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

最佳答案

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

val bodyXML = <body><segment uri="foo"><segment uri="bar" /></segment></body>

请注意,段可以相互嵌套。

一个段实现如下:

case class Segment(uri: String, children: Seq[Segment])

要反序列化 XML,您可以这样做:

val mySegments = topLevelSegments(bodyXML)

...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 }

希望对您有所帮助。

关于xml - 在 Scala 中编码/解码 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com