你有两个不同的问题。
- 它的类型为
Any
.
- 您的数据在 a
Option
和 a内Map
。
假设我们有数据:
val x: Option[Any] = Some(Map("name" -> "jack", "greeting" -> "hi"))
并假设如果有要返回的内容,我们想要返回适当的 XML,否则不返回。然后我们可以collect
用来收集那些我们知道如何处理的部分:
val y = x collect {
case m: Map[_,_] => m collect {
case (key: String, value: String) => key -> value
}
}
(请注意我们如何将映射中的每个条目分开以确保它将字符串映射到字符串——否则我们将不知道如何进行。我们得到:
y: Option[scala.collection.immutable.Map[String,String]] =
Some(Map(name -> jack, greeting -> hi))
好的,这样更好!现在,如果您知道XML 中需要哪些字段,您可以询问它们:
val z = for (m <- y; name <- m.get("name"); greet <- m.get("greeting")) yield {
<test><name>{name}</name><greeting>{greet}</greeting></test>
}
在这种(成功的)案例中产生
z: Option[scala.xml.Elem] =
Some(<test><name>jack</name><greeting>hi</greeting></test>)
并且在不成功的情况下会产生None
.
如果你想将你在 map 中发现的任何东西包装在 form<key>value</key>
中,那就需要做更多的工作,因为 Scala 对标签没有很好的抽象:
val z = for (m <- y) yield <test>{ m.map { case (tag, text) => xml.Elem(null, tag, xml.Null, xml.TopScope, xml.Text(text)) }}</test>
这再次产生
z: Option[scala.xml.Elem] =
Some(<test><name>jack</name><greeting>hi</greeting></test>)
(您可以使用get
来获取 an 的内容,但如果 the为空(即) Option
,它将引发异常。)Option
None