2013-04-18 24 views
1

我正在寻找一种更好的方式来构建Scala中的XML对象,类似于happening in this SO question。我想阅读可能包含缺少元素的XML。目前,我使用的情况下类:Scala:处理可选的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代码片段中,如果这是一个字符串,那很好,但我需要将它视为一个double。目前我正在处理这与隐式转换

implicit def NodeSeqToDouble(value: NodeSeq) = { 
    value.text match { 
    case "" => 0.0 
    case s:String => s.toDouble 
    } 
} 

哪些工作,但似乎冗长,有点难看。我想知道在可选的xml元素中包含类型转换时是否存在处理可选元素的“最佳实践”方式。

回答

2

您的代码存在的一个问题是转换后无法确定double值是否丢失或存在,但设置为0.0

想到的第一件事是标量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存在或缺失仍然保留。

+0

有趣的是,我喜欢那种方法。如果您需要处理该值,则可以利用模式匹配。一个后续问题:DTO的案例类是最佳选择,如果是,是否有另一种方法来指定可选(可空)值,或者是Option [Type]最合适? – mhamrah

+0

@mhamrah案例类似于DTO的合理方法。至于可选(可为空)的值,AFAIK'Option [Type]'是scalas对它们的标准方法。 (请参阅:http://www.scala-lang.org/api/current/index.html#scala.Option) –