Pregunta

Si tienes algo como:

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

¿Cómo creas un valor XML con esos datos como nodos? Sé cómo usar {llaves} en una expresión XML para poner un valor, pero esta es una colección de valores. ¿Necesito iterar explícitamente o hay algo mejor?

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

El valor resultante debe ser algo como:

<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
¿Fue útil?

Solución

Como es un lenguaje de programación funcional, Array.map es probablemente lo que estás buscando:

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

Resultados en:

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

Un resultado formateado (para una mejor lectura):

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

Otros consejos

Para completar, también puede usar para ... rendimiento (o llamadas a funciones):

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

(error corregido observado por Woody Folsom)

En realidad, el rendimiento de línea person.toXml () no se compila para mí, pero rinde person.toXml (sin los paréntesis). La versión original se queja de que 'el valor del método sobrecargado se aplica' incluso si cambio la definición de 'ToXml' para devolver explícitamente un scala.xml.Elem

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top