Scala XML-сериализация - PullRequest
       27

Scala XML-сериализация

7 голосов
/ 16 апреля 2009

Видя мощь Scala, мне интересно, можно ли сериализовать и десериализовать произвольный граф объектов в / из XML, используя встроенные функции и библиотеки языка Scala (например, без XMLEncoder, XStream или JAXB). К сожалению, я не нашел такого решения. Что бы вы могли посоветовать?

Ответы [ 5 ]

8 голосов
/ 10 сентября 2009

Я не знаю, «можно ли сериализовать произвольный граф объектов и десериализовать в / из XML с помощью встроенных функций и библиотек языка Scala», но поскольку в Scala есть некоторая встроенная поддержка XML, я упомяну их. Более подробно можно найти в гл. 26 из Программирование в Scala называется Работа с XML:

В этой главе рассказывается о Scala поддержка XML. После обсуждения полуструктурированные данные в целом, это показывает основные функции в Scala для работы с XML: как сделать узлы с литералами XML, как сохранить и загрузить XML в файлы, и как разбирать узлы XML с помощью запроса методы и сопоставление с образцом.

Чтобы быстро подвести итог главы, я приведу несколько ключевых моментов.

  • Scala включает специальную поддержку для обработки XML.
  • Scala позволяет вводить XML как литерал везде, где допустимо выражение.
  • Вы можете оценить код Scala в середине литерала XML, используя фигурные скобки ({}) в качестве экранирования.

Так что вы можете написать что-то вроде:

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 .

4 голосов
/ 16 апреля 2009

afaik такого нет. Но вы можете взглянуть на sbinary

3 голосов
/ 15 сентября 2011

В пакете 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)
    }
  }

Существует пакет Extraction, в котором есть функции для преобразования хотя бы классов case в JSON. Вместе с toXml это может преобразовать многие типы данных в XML.

1 голос
/ 23 июля 2009

С точки зрения "совета", мы использовали собственные библиотеки для многих быстрых и грязных файлов конфигурации. Основным преимуществом является то, что код «разбора» используется для добавления хороших сообщений об ошибках. Как это:

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, так что это не было большим переключателем. Я не уверен, что вы можете получить сообщение об ошибке + обработку по умолчанию на вашей платформе десериализации с библиотекой.

0 голосов
/ 25 апреля 2009

Ничего в родной библиотеке классов Scala. Но нет недостатка в библиотеках Java, которые будут делать это.

...