Scala: как создать узлы XML из некоторой коллекции - PullRequest
13 голосов
/ 19 октября 2008

Если у вас есть что-то вроде:

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>

Ответы [ 3 ]

21 голосов
/ 19 октября 2008

Поскольку это функциональный язык программирования, 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>
5 голосов
/ 26 ноября 2008

Для полноты вы также можете использовать 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))

(исправлена ​​ошибка, отмеченная Вуди Фолсом)

0 голосов
/ 14 декабря 2008

На самом деле, строка yield person.toXml () не компилируется для меня, но yield person.toXml (без скобок) делает это. Оригинальная версия жалуется на «применение перегруженного значения метода», даже если я изменяю определение «ToXml», чтобы явно возвращать scala.xml.Elem

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...