2013-04-18 3 views
1

happening in this SO question과 비슷한 스칼라의 XML에서 객체를 빌드하는 더 나은 방법을 찾고 있습니다. 누락 된 요소가 포함될 수있는 xml을 읽으 려합니다. XML을 읽을 때, 나는 다음과 같은 기능에 노드를 전달하고있어스칼라 : 선택적 XML 요소 및 사례 클래스 처리

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

: 현재 나는 경우 클래스를 사용하고

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 요소에 관련되어있을 때 선택적 요소를 다루는 "최상의 방법"이 있는지 궁금합니다.

답변

2

코드에있는 한 가지 문제점은 변환 후 double 값이 없거나 존재하지만 있지만 0.0으로 설정했는지 여부를 알 수 없다는 것입니다.

마음에 오는 가장 중요한 것은 scalas Option입니다. 귀하의 경우 클래스과 같습니다

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

그리고 변환이 될 것이다 : 이것은 변환 후 정보가 double 여부를 현재 또는 여전히 유지없는 것을 의미

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

.

+0

흥미 롭다. 나는 그 접근법을 좋아한다. 그 값을 처리해야하는 경우 패턴 일치를 활용할 수 있습니다. 하나의 후속 질문 : 사례 클래스는 DTO에 가장 적합한 옵션이며, 그렇다면 선택적 (nullable) 값을 지정하는 다른 방법이 있습니까? 아니면 Option [Type]이 가장 적합합니까? – mhamrah

+0

@mhamrah 사례 클래스는 DTO에 대한 합리적인 접근법으로 보입니다. 선택적 (nullable) 값에 관해서는 AFAIK'Option [Type]'은 그것들에 대한 스칼라 표준 접근법이다. (참조 : http://www.scala-lang.org/api/current/index.html#scala.Option) –