Scala: comment créer des noeuds XML à partir d'une collection
Question
Si vous avez quelque chose comme:
val myStuff = Array(Person("joe",40), Person("mary", 35))
Comment créez-vous une valeur XML avec ces données en tant que nœuds? Je sais comment utiliser {accolades} dans une expression XML pour mettre une valeur, mais il s'agit d'un ensemble de valeurs. Dois-je itérer explicitement ou y a-t-il quelque chose de mieux?
val myXml = <people>{ /* what here?! */ }</people>
La valeur résultante devrait être quelque chose comme:
<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
La solution
En tant que langage de programmation fonctionnel, Array.map est probablement ce que vous recherchez:
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)
}
}
Résultats en:
<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people>
Un résultat formaté (pour une meilleure lecture):
<people>
<person>
<name>Alice</name>
<age>16</age>
</person>
<person>
<name>Bob</name>
<age>64</age>
</person>
</people>
Autres conseils
Pour être complet, vous pouvez également utiliser for..yield (ou appels de fonction):
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))
(erreur fixe notée par Woody Folsom)
En fait, la ligne de rendement personne.toXml () ne compile pas pour moi, mais cède personne.toXml (sans les parenthèses). La version originale se plaint de l'application de la méthode "surchargée" même si je modifie la définition de "ToXml" pour renvoyer explicitement un scala.xml.Elem