Scala:处理可选的XML元素和Case Classes

时间:2013-04-18 20:58:54

标签: xml scala coding-style xml-parsing implicit-conversion

我正在寻找一种在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元素上涉及类型转换时是否存在处理可选元素的“最佳实践”方法。

1 个答案:

答案 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是否存在或遗失的信息仍然保留。