Scala:如何从某个集合创建XML节点

Scala:如何从某个集合创建XML节点,xml,scala,Xml,Scala,如果您有以下情况: val myStuff = Array(Person("joe",40), Person("mary", 35)) <people><person><name>joe</name><age>40</age></person> <person><name>mary</name><age>39</age></person>&

如果您有以下情况:

val myStuff = Array(Person("joe",40), Person("mary", 35))
<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
如何使用该数据作为节点创建XML值?我知道如何在XML表达式中使用{大括号}来放置值,但这是一个值的集合。我需要显式迭代还是有更好的方法

val myXml = <people>{ /* what here?! */ }</people>
val myXml={/*这里是什么?!*/}
结果值应类似于:

val myStuff = Array(Person("joe",40), Person("mary", 35))
<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
joe40
玛丽39

因为它是一种函数式编程语言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)
    }
}
class-Person(姓名:String,年龄:Int){
def toXml()={name}{age}
}
对象xml{
val people=列表(
新人(“爱丽丝”,16岁),
新人(“鲍勃”,64岁)
)
val data={people.map(p=>p.toXml())}
def main(参数:数组[字符串]){
println(数据)
}
}
结果:

<people><person><name>Alice</name><age>16</age></person><person><name>Bob</name><age>64</age></person></people>
Alice16Bob64
格式化结果(为了更好地阅读):


爱丽丝
16
上下快速移动
64

为完整起见,您还可以使用For..yield(或函数调用):

导入scala.xml
案例类人员(val名称:字符串,val年龄:Int){
def toXml():xml.Elem=
{name}{age}
}
def peopleToXml(人员:List[Person]):xml.Elem={
{
对于{person 39}
屈服于人
}
}
val数据=列表(个人(“乔”,40岁),个人(“玛丽”,35岁))
println(peopleToXml(数据))

(修复了Woody Folsom指出的错误)

实际上,行yield person.toXml()并没有为我编译,但yield person.toXml(不带括号)可以编译。原始版本抱怨“重载方法值应用”,即使我更改了“ToXml”的定义以显式返回scala.xml.Elem,我在解释器中没有收到任何错误,但可能是因为我忘记了在ToXml()中设置返回类型,所以它以某种方式变成了单位。此外,我还删除了toXml正文中错误的分号。:)这种方法的优点是什么?我想学习更多关于Scala的知识,我很好奇,这只是一种不同的语法。在我的代码中,我通常使用map()来代替答案。