質問
次のようなものがある場合:
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>
解決
関数型プログラミング言語なので、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>
フォーマットされた結果(読みやすくするため):
<people>
<person>
<name>Alice</name>
<age>16</age>
</person>
<person>
<name>Bob</name>
<age>64</age>
</person>
</people>
他のヒント
完全を期すために、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))
(ウッディフォルサムが指摘した修正済みのエラー)
実際には、yield person.toXml()行はコンパイルされませんが、yield person.toXml(括弧なし)はコンパイルされます。元のバージョンでは、「ToXml」のdefを変更してscala.xml.Elemを明示的に返す場合でも、「オーバーロードされたメソッド値が適用される」と文句を言います。
所属していません StackOverflow