Я построил алгоритм следующим образом:
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")
Ничего в библиотеке классов 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, так что это не было большим переключением. Я не уверен, что вы можете получить сообщение об ошибке + обработку по умолчанию в вашей среде десериализации с помощью библиотеки.
Я не знаю, «можно ли сериализовать и десериализовать произвольный граф объектов в / из XML с использованием встроенных функций и библиотек языка Scala», но поскольку есть некоторая встроенная поддержка XML в Scala я их упомяну. Более подробную информацию можно найти в гл. 26 из Программирование на Scala под названием «Работа с XML»:
Эта глава знакомит с поддержка XML. После обсуждения полуструктурированные данные в целом, это показывает основные функции в Scala для управления XML: как создавать узлы с XML-литералами, как сохранять и загружать XML в файлы, и как разбирать узлы XML с помощью запроса методы и сопоставление с образцом.
Чтобы быстро резюмировать главу, я процитирую некоторые ключевые моменты.
Таким образом, вы можете написать что-то вроде:
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 .