Frage

Wenn Sie so etwas wie:

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

Wie Sie einen XML-Wert mit diesen Daten als Knoten erstellen? Ich weiß, wie {Klammern} verwenden, in einem XML-Ausdruck einen Wert zu setzen, aber das ist eine Sammlung von Werten. Muss ich ausdrücklich wiederholen, oder gibt es etwas Besseres?

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

Der resultierende Wert sollte so etwas sein:

<people><person><name>joe</name><age>40</age></person>
<person><name>mary</name><age>39</age></person></people>
War es hilfreich?

Lösung

Da es eine funktionale Programmiersprache Array.map ist, ist wahrscheinlich das, was Sie suchen:

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

Ergebnisse in:

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

Eine formatierte Ergebnis (für eine bessere lesen):

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

Andere Tipps

Für die Vollständigkeit, können Sie auch for..yield (oder Funktionsaufrufe):

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

(Fest Fehler festgestellt, von Woody Folsom)

Eigentlich ist die Linienausbeute person.toXml () für mich nicht kompiliert, sondern Ausbeute person.toXml (ohne Klammern) der Fall ist. Die ursprüngliche Version klagt über ‚überladene Methode Wert anwenden‘, auch wenn ich die def von ‚ToXml‘ ändern, um eine scala.xml.Elem explizit zurückgeben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top