2008-10-19 59 views
13

创建XML节点。如果你有这样的:斯卡拉:如何从一些收集

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

如何创建与数据节点的XML值?我知道如何在XML表达式中使用{大括号}来放置一个值,但这是一组值。我需要明确迭代还是有更好的?

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

结果值应该是这样的:

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

回答

21

由于它是一种函数式编程语言Array.map可能是你在找什么:在

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

结果:

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

为了完整起见,你也可以使用for..yield(或函数调用):

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

(固定误差由伍迪福尔瑟姆说明)

+0

这种方法的优点是什么?我想了解更多关于Scala的信息,我很好奇。 – ScArcher2 2011-02-03 16:20:27

+0

这只是一种不同的语法。在我的代码中,我通常使用map()而不是像Aaron Maenpaa的答案。 – hishadow 2011-02-07 18:37:13

0

其实,良率person.toXml()不编译对我来说,但收益person.toXml(没有括号)。原始版本抱怨'重载的方法值适用',即使我改变'ToXml'的def来明确地返回一个scala.xml.Elem