【问题标题】:Scala: how to create XML nodes from some collectionScala:如何从某个集合创建 XML 节点
【发布时间】:2010-09-17 23:07:00
【问题描述】:

如果你有类似的东西:

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>

【问题讨论】:

    标签: xml scala


    【解决方案1】:

    因为它是一种函数式编程语言 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>
    

    【讨论】:

      【解决方案2】:

      为了完整起见,您还可以使用 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 指出的错误)

      【讨论】:

      • 这种方法的优势是什么?我正在尝试更多地了解 Scala,我很好奇。
      • 只是语法不同。在我的代码中,我通常使用 map() 来代替 Aaron Maenpaa 的答案。
      【解决方案3】:

      实际上,yield person.toXml() 行不为我编译,但 yield person.toXml(不带括号)可以。即使我将“ToXml”的定义更改为显式返回 scala.xml.Elem ,原始版本也会抱怨“应用重载的方法值”

      【讨论】:

      • 我在解释器中没有收到任何错误,但可能是因为我忘记了在 toXml() 中设置返回类型,所以它以某种方式变成了 Unit。此外,我还删除了 toXml 正文中的错误分号。 :)
      猜你喜欢
      • 2016-05-13
      • 2012-10-03
      • 2010-10-21
      • 2015-10-09
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多