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>
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top