0

私は Scala を使い始めたばかりなので、初心者の質問でご容赦ください。:) 私は Scala での XML サポートの素晴らしい力を探っていて、タスクにたどり着きました: ブール値のような値を含むノードを持つ XML ドキュメントがあります: <bool_node>true</bool_node>. ブールフィールドを持つケースクラスもあります。私が達成したいのは、XML からそのクラスのインスタンスを作成することです。

The problem, obviously, is that for XML <bool_node> contains just a string, not boolean. What is the best way to handle this situation? Just try to convert that string to boolean using myString.toBoolean? Or some other approach could is better?

Thanks in advance!

4

1 に答える 1

2

個人的には、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 構文はどちらも構成可能で相互運用可能です。

于 2013-04-10T10:01:16.020 に答える