Domanda

Se hai qualcosa del tipo:

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

Come si crea un valore XML con quei dati come nodi? So come usare {parentesi graffe} in un'espressione XML per mettere un valore, ma questa è una raccolta di valori. Devo iterare esplicitamente o c'è qualcosa di meglio?

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

Il valore risultante dovrebbe essere simile a:

<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
È stato utile?

Soluzione

Essendo un linguaggio di programmazione funzionale Array.map è probabilmente quello che stai cercando:

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)
    }
}

Risultati in:

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

Un risultato formattato (per una lettura migliore):

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

Altri suggerimenti

Per completezza, puoi anche usare for..yield (o chiamate di funzione):

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))

(errore corretto rilevato da Woody Folsom)

In realtà, la linea yield person.toXml () non viene compilata per me, ma produce person.toXml (senza le parentesi). La versione originale si lamenta di "applicare il valore del metodo sovraccarico" anche se cambio la definizione di "ToXml" per restituire esplicitamente uno scala.xml.Elem

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top