Scala: wie XML-Knoten von einer Sammlung erstellen
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>
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