2008-10-19 35 views
13

Si usted tiene algo así como:Scala: cómo crear nodos XML de alguna colección

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

¿Cómo crea 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. ¿Debo 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> 

Respuesta

21

Como se trata de un lenguaje de programación funcional Array.map es probablemente lo que usted está 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> 
5

Para completar, también se puede utilizar for..yield (o las llamadas de función):

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

(Corregido el error señalado por Woody Folsom)

+0

¿Cuál es la ventaja de este enfoque? Estoy tratando de aprender más sobre Scala y tengo curiosidad. – ScArcher2

+0

Es solo una sintaxis diferente. En mi código usualmente uso map() como en la respuesta de Aaron Maenpaa. – hishadow

0

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

+0

No recibí ningún error en el intérprete, pero tal vez es porque olvidé el conjunto del tipo de devolución en XML(), por lo que de alguna manera se convirtió en Unidad. Además, eliminé un punto y coma erróneo en el cuerpo de toXml también. :) – hishadow

Cuestiones relacionadas