【问题标题】:How to extract boolean values from XML to Scala case class如何从 XML 提取布尔值到 Scala 案例类
【发布时间】:2013-04-04 17:13:53
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • @alexwriteshere 谢谢,我已经看到了这个问题,我知道toBoolean 方法。如果 XML 需要一些特殊处理,或者有一些最佳实践,比如验证,只是徘徊。

标签: scala xml-parsing playframework-2.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 样式语法,这将起作用:

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

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

【讨论】:

  • 感谢您的回答,内容丰富。我不接受它,因为具有已接受答案的 StackOverflow 问题往往会被社区忽略,我仍然希望有人能提供更多信息,或者可能是另一个示例,或者至少给出这个答案 +1,以表明它是已完成,无法添加任何内容。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2016-02-28
  • 2017-09-29
  • 2015-03-03
  • 1970-01-01
  • 2014-07-29
相关资源
最近更新 更多