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?