Scala XML序列化

Scala XML序列化,xml,serialization,scala,Xml,Serialization,Scala,看到Scala的强大功能,我想知道是否可以使用内置的Scala语言功能和库(例如,没有XMLEncoder、XStream或JAXB)将任意对象图序列化并从XML反序列化到XML。不幸的是,我还没有找到这样的解决办法。你有什么建议吗?恐怕没有这回事。但您可能想看看Scala本机类库中的任何内容。但是并不缺少能够做到这一点的Java库。在“建议”方面,我们已经使用本机库来处理许多快速而肮脏的配置文件。主要优点是“解析”代码用于添加漂亮的错误消息。像这样: val xml = xml.XML.loa

看到Scala的强大功能,我想知道是否可以使用内置的Scala语言功能和库(例如,没有XMLEncoder、XStream或JAXB)将任意对象图序列化并从XML反序列化到XML。不幸的是,我还没有找到这样的解决办法。你有什么建议吗?

恐怕没有这回事。但您可能想看看Scala本机类库中的任何内容。但是并不缺少能够做到这一点的Java库。

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

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之类的东西的地方,所以它不是一个很大的开关。我不确定你是否能在反序列化框架上通过库获得错误消息+默认处理。

我不知道“是否可以使用内置的Scala语言功能和库将任意对象图序列化并反序列化到XML或从XML反序列化到XML”,但由于Scala中有一些对XML的本机支持,我将提及它们。更多详细信息请参见《使用XML:

本章介绍Scala的 对XML的支持。讨论后 一般来说,它是半结构化数据 显示了中的基本功能 用于处理XML的Scala:如何 使用XML文本创建节点,如何 保存XML并将其加载到文件,以及如何 使用查询分离XML节点 方法和模式匹配

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

  • Scala包括对处理XML的特殊支持
  • Scala允许您在表达式有效的任何位置键入XML作为文本
  • 可以使用卷轴括号({})作为一个转义来评估XML文本中间的Scala代码。
所以你可以写这样的东西:

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

另外,在一本名为

的手册草稿中可以找到更多信息。在net.liftweb.json包object 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)
    }
  }

有一个提取包,它的函数至少可以将case类转换为JSON。与toXml一起,这可能会将许多数据类型转换为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)
    }
  }