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

Posted

技术标签:

【中文标题】Scala:如何从某个集合创建 XML 节点【英文标题】:Scala: how to create XML nodes from some collection 【发布时间】: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>

【问题讨论】:

【参考方案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 正文中的错误分号。 :)

以上是关于Scala:如何从某个集合创建 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章

递归集合并集:它是如何工作的?

如何将此 SetLike 集合从 Scala 2.12 转换为 2.13?

如何使用 Xml 属性序列化带有节点集合的 XML

Spark:scala - 如何将集合从 RDD 转换为另一个 RDD

在 Scala 中迭代 Java 集合

如何使函数与Scala中的任何数字类型的集合一起使用