2つの別々の問題があります。
- と入力し
Any
ます。
- データはとの中に
Option
あり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
ます。
代わりに、マップで見つけたものをフォームでラップしたい場合は、<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
しての内容を取得できますが、が空の場合(つまり) Option
、例外がスローされます。)Option
None