2008-10-19 86 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