13

次のようなものがある場合:

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

3 に答える 3

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>

フォーマットされた結果(読みやすくするため):

<people>
   <person>
      <name>Alice</name>
      <age>16</age>
   </person>
   <person>
      <name>Bob</name>
      <age>64</age>
   </person>
</people>
于 2008-10-19T01:36:18.407 に答える
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))

(Woody Folsom が指摘したエラーを修正)

于 2008-11-25T23:08:14.667 に答える
0

実際、yield person.toXml() という行はコンパイルされませんが、yield person.toXml (かっこなし) はコンパイルされます。「ToXml」の定義を明示的にscala.xml.Elemを返すように変更しても、元のバージョンは「オーバーロードされたメソッド値が適用されます」と文句を言います

于 2008-12-13T22:56:34.340 に答える