2013-04-04 52 views
0

我刚刚开始使用Scala,因此请耐心等待我的新手问题。 :)我正在探索Scala中XML支持的强大能力,并接受了一个任务:我有一个包含类似布尔值的节点的XML文档:<bool_node>true</bool_node>。我还有一个带有布尔字段的案例类。我想要实现的是从XML中创建该类的一个实例。如何从XML提取布尔值到Scala案例类

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

在此先感谢!

+0

可能的诱惑http://stackoverflow.com/questions/1470230/scala-elegant-conversion-of-a-string-into-a-boolean – 2013-04-04 17:26:12

+0

@alexwriteshere谢谢,我已经看到了这个问题, m知道'toBoolean'方法。如果XML需要一些特殊处理,或者有一些最佳实践(如验证),那么只是漫游。 – Haspemulator 2013-04-04 17:33:09

回答

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 

或者,你可以混合和匹配他们为y ou看起来合适 - 模式匹配和XPath语法都是可组合和互操作的。

+0

感谢您的回答,它的内容丰富。我不接受它,因为接受答案的StackOverflow问题往往被社区忽略,我仍然希望有人会提供一些更多的信息,或者另外一个例子,或者至少给出这个答案+1,以表明它是完成,没有什么可以添加。 – Haspemulator 2013-04-11 16:03:35