我正在寻找一种在Scala中使用XML构建对象的更好方法,类似于happening in this SO question。我想阅读可能包含缺失元素的xml。目前,我正在使用案例类:
case class Content(name:String, description:String, someDouble: Double)
当读取xml时,我将节点传递给以下函数:
def buildContent(node: Node) = {
Content((node \ "name").text,
(node \ "description").text,
(node \ "someDouble")
}
我的问题是“someDouble”可能会或可能不会出现在当前的XML片段中,如果这是一个字符串就没问题,但我需要将其视为双精度片段。目前我正在通过隐式转换处理此问题
implicit def NodeSeqToDouble(value: NodeSeq) = {
value.text match {
case "" => 0.0
case s:String => s.toDouble
}
}
哪个有效,但看起来很冗长,有些难看。我想知道在可选的xml元素上涉及类型转换时是否存在处理可选元素的“最佳实践”方法。
答案 0 :(得分:2)
您的代码存在的一个问题是,转换后无法判断double
值是否缺失或是否存在但设置为0.0
。
首先想到的是scalas Option
。
您的案例类看起来像:
case class Content(name:String, description:String, someDouble: Option[Double])
转换将是:
implicit def NodeSeqToDouble(value: NodeSeq) = {
value.text match {
case "" => None
case s:String => Some(s.toDouble)
}
}
这意味着转换后,double
是否存在或遗失的信息仍然保留。