我刚开始使用Scala,所以请忍受我的新手问题。 :)我正在探索Scala中XML支持的强大功能,并开始执行任务:我有一个XML文档,其中包含一个类似布尔值的节点:<bool_node>true</bool_node>
。我还有一个带有布尔字段的case类。我想要实现的是从XML创建该类的实例。
显然,问题是XML <bool_node>
只包含一个字符串,而不是布尔值。处理这种情况的最佳方法是什么?只是尝试使用myString.toBoolean
将该字符串转换为布尔值?或者其他一些方法可能更好?
提前致谢!
答案 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语法都是可组合和可互操作的。