2008-10-19 7 views
13

Si vous avez quelque chose comme:Scala: comment créer des nœuds XML à partir d'une collection

val myStuff = Array(Person("joe",40), Person("mary", 35)) 

Comment créer une valeur XML avec les données sous forme de nœuds? Je sais comment utiliser {accolades} dans une expression XML pour mettre une valeur, mais c'est une collection de valeurs. Ai-je besoin d'itérer explicitement ou y a-t-il quelque chose de mieux?

val myXml = <people>{ /* what here?! */ }</people> 

La valeur résultante doit être quelque chose comme:

<people><person><name>joe</name><age>40</age></person> 
<person><name>mary</name><age>39</age></person></people> 

Répondre

21

Comme il est un langage de programmation fonctionnelle Array.map est probablement ce que vous cherchez:

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 dans:

<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people> 
5

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é Woody Folsom)

+0

Quel est l'avantage de cette approche? J'essaie d'en savoir plus sur Scala et je suis curieux. – ScArcher2

+0

C'est juste une syntaxe différente. Dans mon code, j'utilise habituellement map() à la place, comme dans la réponse d'Aaron Maenpaa. – hishadow

0

En fait, les person.toXml de rendement en ligne() ne compile pas pour moi, mais donne person.toXml (sans les parenthèses) fait. La version originale se plaint de 'la valeur de la méthode surchargée s'applique' même si je change le def de 'ToXml' pour retourner explicitement un scala.xml.Elem

+0

Je n'ai pas eu d'erreur dans l'interpréteur, mais c'est peut-être parce que j'ai oublié de définir le type de retour dans toXml() pour que ce soit en quelque sorte devenu Unit. J'ai également supprimé un point virgule erroné dans le corps toXml. :) – hishadow

Questions connexes