7

Seeing the power of Scala, I wonder if an arbitrary object graph could be serialized and deserialized to/from XML using built-in Scala language features and libraries (e.g. without XMLEncoder, XStream or JAXB). Unfortunately, I haven't found such a solution. What could you advise?

4

5 回答 5

8

我不知道“是否可以使用内置的 Scala 语言功能和库对任意对象图进行序列化和反序列化到 XML 或从 XML 反序列化”,但由于 Scala 中有一些对 XML 的本机支持,所以我会提到它们。更多细节可以在 Ch 中找到。Programming in Scala 中的 26篇名为 Working with XML:

本章介绍 Scala 对 XML 的支持。在讨论了一般的半结构化数据之后,它展示了 Scala 中用于操作 XML 的基本功能:如何使用 XML 文字创建节点,如何将 XML 保存和加载到文件中,以及如何使用查询方法和模式匹配来拆分 XML 节点.

为了快速总结本章,我将引用一些关键点。

  • Scala 包括对处理 XML 的特殊支持。
  • Scala 允许您在表达式有效的任何地方输入 XML 作为文字。
  • 您可以通过使用花括号 ({}) 作为转义来在 XML 文字中间评估 Scala 代码。

因此,您可以编写如下内容:

val foo = <a> {3 + 4} </a>

以上评估为scala.xml.Elem = <a> 7 </a>

  • 如果要通过标签名称查找子元素,只需\使用标签名称调用即可。
  • \\您可以使用而不是运算符进行“深度搜索”并查看子子元素等\

这本书有一个抽象类的序列化和反序列化的例子,但它是手写的:

abstract class CCTherm {
  val description: String
  val yearMade: Int

  def toXML =
    <cctherm>
      <description>{description}</description>
      <yearMade>{yearMade}</yearMade>
    </cctherm>

  def fromXML(node: scala.xml.Node): CCTherm =
    new CCTherm {
      val description = (node \ "description").text
      val yearMade    = (node \ "yearMade").text.toInt
    }    
}

更多信息可以在名为scala.xml的草稿书中找到。

于 2009-09-10T05:42:35.810 回答
4

afaik没有这样的事情。但你可能想看看sbinary

于 2009-04-16T15:07:04.027 回答
3

在包 net.liftweb.json, 对象 xml 中,我找到了以下函数:

def toXml(json: JValue): NodeSeq = {
    def toXml(name: String, json: JValue): NodeSeq = json match {
      case JObject(fields) => new XmlNode(name, fields flatMap { f => toXml(f.name, f.value) })
      case JArray(xs) => xs flatMap { v => toXml(name, v) }
      case JField(n, v) => new XmlNode(name, toXml(n, v))
      case JInt(x) => new XmlElem(name, x.toString)
      case JDouble(x) => new XmlElem(name, x.toString)
      case JString(x) => new XmlElem(name, x)
      case JBool(x) => new XmlElem(name, x.toString)
      case JNull => new XmlElem(name, "null")
      case JNothing => Text("")
    }

    json match {
      case JField(n, v) => toXml(n, v)
      case JObject(fields) => fields flatMap { f => toXml(f.name, f.value) }
      case x => toXml("root", x)
    }
  }

有一个提取包,它具有将至少案例类转换为 JSON 的功能。与 toXml 一起,这可能会将许多数据类型转换为 XML。

于 2011-09-15T15:48:36.950 回答
1

就“建议”而言,我们一直在使用本地库来处理许多快速而肮脏的配置文件。主要优点是“解析”代码用于添加漂亮的错误消息。像这样:

val xml = xml.XML.load( source )

val required = ( xml \ "value" ).firstOption match {
    case None => error( "The value element is missing, or should I be a default?" )
    case Some( req ) => req
}

这是我通常使用 XStream 之类的东西的地方,所以它不是一个大开关。我不确定您是否可以使用库在反序列化框架上获得错误消息+默认处理。

于 2009-07-23T19:50:38.753 回答
0

Scala 的原生类库中没有任何内容。但是不乏能够做到这一点的 Java 库。

于 2009-04-24T21:10:46.030 回答