2013-04-18 3 views
1

Je cherche une meilleure façon de construire des objets à partir de XML dans Scala, similaire à happening in this SO question. J'aimerais lire xml qui peut contenir des éléments manquants. À l'heure actuelle, j'utilise une classe de cas:Scala: Traitement des éléments XML optionnels et des classes de cas

case class Content(name:String, description:String, someDouble: Double) 

Lors de la lecture xml, je passe dans un nœud à la fonction suivante:

def buildContent(node: Node) = { 
    Content((node \ "name").text, 
      (node \ "description").text, 
      (node \ "someDouble") 
} 

Mon problème est que « someDouble » peut ou peut ne pas être présent dans l'extrait XML en cours, ce qui serait bien si c'était une chaîne mais je dois le traiter comme un double. Actuellement, je gère cela avec une conversion implicite

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

Qui fonctionne, mais semble verbeux et un peu moche. Je me demande s'il existe une façon de «traiter les éléments facultatifs» lorsqu'une conversion de type est impliquée dans un élément xml optionnel.

Répondre

2

Un problème avec votre code est que, après la conversion, il est impossible de dire si la valeur double était manquante ou si elle était présente mais définie sur 0.0.

La première chose qui vient à l'esprit sont les scalas Option. Votre classe affaire ressemblerait à ceci:

case class Content(name:String, description:String, someDouble: Option[Double]) 

Et la conversion serait:

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

Cela signifie que, après la conversion des informations si le double était présent ou absent est encore conservé.

+0

Intéressant, j'aime cette approche. Vous pouvez ensuite exploiter la correspondance de modèle si vous devez traiter cette valeur. Une question de suivi: est-ce qu'une classe de cas est la meilleure option pour un DTO, et si oui, existe-t-il une manière différente de spécifier des valeurs optionnelles (nullables), ou Option [Type] est-elle la meilleure? – mhamrah

+0

@mhamrah Les classes de cas semblent une approche raisonnable pour les DTO. Comme pour les valeurs facultatives (nullable) AFAIK 'Option [Type]' est l'approche standard de scalas à eux. (Voir: http://www.scala-lang.org/api/current/index.html#scala.Option) –

Questions connexes