Scala: как создать узлы XML из некоторой коллекции
Если у вас есть что-то вроде:
val myStuff = Array(Person("joe",40), Person("mary", 35))
Как вы создаете значение XML с этими данными как узлы? Я знаю, как использовать {braces} в выражении XML, чтобы поместить значение, но это набор значений. Нужно ли мне итератировать явно или есть что-то лучше?
val myXml = <people>{ /* what here?! */ }</people>
Результирующее значение должно быть примерно таким:
<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
Ответы
Ответ 1
В качестве функционального языка программирования Array.map, вероятно, вы ищете:
class Person(name : String, age : Int){
def toXml() = <person><name>{ name }</name><age>{ age }</age></person>;
}
object xml {
val people = List(
new Person("Alice", 16),
new Person("Bob", 64)
);
val data = <people>{ people.map(p => p.toXml()) }</people>;
def main(args : Array[String]){
println(data);
}
}
Результаты в:
<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people>
Ответ 2
Для полноты вы также можете использовать для... (или вызовов функций):
import scala.xml
case class Person(val name: String, val age: Int) {
def toXml(): xml.Elem =
<person><name>{ name }</name><age>{ age }</age></person>
}
def peopleToXml(people: List[Person]): xml.Elem = {
<people>{
for {person <- people if person.age > 39}
yield person.toXml
}</people>
}
val data = List(Person("joe",40),Person("mary", 35))
println(peopleToXml(data))
(фиксированная ошибка отмечена Вуди Фолсом)
Ответ 3
Собственно, строка yield person.toXml() не компилируется для меня, но дает person.toXml(без круглых скобок). Исходная версия жалуется на "значение перегруженного метода", даже если я изменяю def of "ToXml", чтобы явно вернуть scala.xml.Elem