代码之家  ›  专栏  ›  技术社区  ›  Germán

scala:如何从某个集合创建XML节点

  •  13
  • Germán  · 技术社区  · 16 年前

    如果你有类似的东西:

    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 回复  |  直到 6 年前
        1
  •  21
  •   temonehm    6 年前

    因为它是一个函数式编程语言数组。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>
    
        2
  •  5
  •   hishadow    14 年前

    为了完整性,还可以使用..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记录的修正错误)

        3
  •  0
  •   Woody Folsom    16 年前

    实际上,yield person.toxml()一行不是为我编译的,而是yield person.toxml(不带括号)编译的。原始版本抱怨“重载方法值应用”,即使我更改“to xml”的定义以显式返回scala.xml.elem