Scala XML serialization Scala XML serialization xml xml

Scala XML serialization


I don't know "if an arbitrary object graph could be serialized and deserialized to/from XML using built-in Scala language features and libraries," but since there are some native support for XML in Scala, I'll mention them. More detail could be found in Ch. 26 of Programming in Scala called Working with XML:

This chapter introduces Scala's support for XML. After discussing semi-structured data in general, it shows the essential functionality in Scala for manipulating XML: how to make nodes with XML literals, how to save and load XML to files, and how to take apart XML nodes using query methods and pattern matching.

To quickly summarize the chapter, I'll quote some key points.

  • Scala includes special support for processing XML.
  • Scala lets you type in XML as a literal anywhere that an expression is valid.
  • You can evaluate Scala code in the middle of of an XML literal by using curly braces ({}) as an escape.

So you can write something like:

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

The above evaluates to scala.xml.Elem = <a> 7 </a>.

  • If you want to find a sub-element by tag name, simply call \ with the name of the tag.
  • You can do a "deep search" and look through sub-sub-elements, etc. by using \\ instead of the \ operator.

The book has an example of serialization and deserialization of an abstract class, but it's hand-written:

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

Also more info could be found in a draft book called scala.xml.


afaik there is no such thing. But you might want to take a look at sbinary


In the package net.liftweb.json, object xml, I find the following function:

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

There is an Extraction package that has functions to convert at least case classes to JSON. Together with toXml, this might convert many data types to XML.