Сериализация XML Scala

Я построил алгоритм следующим образом:

function omitNodeWithName(tree, name) {
  if (tree.name === name) return undefined;

  const children = tree.children.map(child => omitNodeWithName(child, name))
    .filter(node => !!node);

  return {
    ...tree,
    children
  }  
}

Вы можете использовать его для возврата нового дерева без элемента:

noHydrogen = omitNodeWithName(tree, "Hydrogen")
7
задан thSoft 16 April 2009 в 14:14
поделиться

4 ответа

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

4
ответ дан 6 December 2019 в 12:54
поделиться

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

0
ответ дан 6 December 2019 в 12:54
поделиться

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

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

1
ответ дан 6 December 2019 в 12:54
поделиться

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

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

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

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

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

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

Вышеупомянутое вычисляет scala.xml.Elem = 7 .

  • Если вы хотите найти подэлемент по имени тега, просто вызовите \ с именем тега.
  • Вы можете выполнить «глубокий поиск» и просмотреть суб-субэлементы и т. Д., Используя \\ вместо оператора \ .

В книге есть пример сериализации и десериализации абстрактного класса, но написанный от руки:

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 .

8
ответ дан 6 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: