如何从XML中提取布尔值到Scala案例类

时间:2013-04-04 17:13:54

标签: scala xml-parsing playframework-2.0

我刚开始使用Scala,所以请忍受我的新手问题。 :)我正在探索Scala中XML支持的强大功能,并开始执行任务:我有一个XML文档,其中包含一个类似布尔值的节点:<bool_node>true</bool_node>。我还有一个带有布尔字段的case类。我想要实现的是从XML创建该类的实例。

显然,问题是XML <bool_node>只包含一个字符串,而不是布尔值。处理这种情况的最佳方法是什么?只是尝试使用myString.toBoolean将该字符串转换为布尔值?或者其他一些方法可能更好?

提前致谢!

1 个答案:

答案 0 :(得分:1)

就个人而言,我喜欢使用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 sytle语法,则可以使用:

val myBool = (xml \ "bool_node").text.toBoolean

或者,您可以根据需要混合和匹配它们 - 模式匹配和XPath语法都是可组合和可互操作的。