個人的には、XML のパターン マッチングを使用するのが好きです。
最も簡単なアプローチは次のようなものです。
// This would have come from somewhere else
val sourceData = <root><bool_node>true</bool_node></root>
// Notice the XML on the left hand side. This is because the left hand side is a
// pattern, for pattern matching.
// This will set stringBool to "true"
val <root><bool_node>{stringBool}</bool_node><root> = sourceData
// stringBool is a String, so must be converted to a Boolean before use
val myBool = stringBool.toBoolean
これが頻繁に発生する場合に有効な別のアプローチは、独自のエクストラクタを定義することです。
// This only has to be defined once
import scala.xml.{NodeSeq, Text}
object Bool {
def unapply(node: NodeSeq) = node match {
case Text("true") => Some(true)
case Text("false") => Some(false)
case _ => None
}
}
// Again, notice the XML on the left hand side. This will set myBool to true.
// myBool is already a Boolean, so no further conversion is necessary
val <root><bool_node>{Bool(myBool)}</bool_node></root> = sourceData
または、XPath スタイルの構文を使用している場合は、次のように動作します。
val myBool = (xml \ "bool_node").text.toBoolean
または、必要に応じてそれらを組み合わせることもできます。パターン マッチングと XPath 構文はどちらも構成可能で相互運用可能です。