2013-04-17 2 views
0

내가있을 수 있습니다 또는 요소가 요소 <EName>어떻게 수율 루프

예 내에있는 <Popular> 라고하지 수있는 XML 파일을 구문 분석 당겨 해요위한 스칼라에서 기존 값을 처리하지 않습니다

<Info> 
<Enterprise> 
<EName> 
<Legal>Cool company</Legal> 
</EName> 
</Enterprise> 
<Enterprise> 
<EName> 
<Legal>Cool company2</Legal> 
<Popular>The company 2</Popular> 
</EName> 
</Enterprise> 
</Info> 

나는이 같은 스칼라 스케일 XML를 사용

val Info = NoNamespaceQName("Info") 
val Enterprise = NoNamespaceQName("Enterprise") 
val EName = NoNamespaceQName("EName") 
val Legal = NoNamespaceQName("Legal") 
val Popular = NoNamespaceQName("Popular") 

val EnterprisePath = List(Info, Enterprise) 

    val itr = iterate(EnterprisePath, xml) 
    for { 
     enterprise <- itr 
     enterpriseName <- enterprise \* EName \* Legal 
     enterprisePopularName <- enterprise \* EName \* Popular 
    } { 
     // Do fun stuff 
     Logger.info("enterprise: "+enterpriseName + " "+enterprisePopularName) 
} 
Popular 요소가 존재하지 않으면 for 문이 수행되지 않고 yield 문이 실행되지 않습니다. 내가 좋아하는 것이 무엇

먼저 요소를 확인하고 인기있는 요소가 비어있는 경우, 빈 문자열

뭔가 등에 enterprisePopularName을 설정

<- if((enterprise \* EName \* Popular)) enterprise \* EName \* Popular else ""  

하지만 그것을 알아낼 수 없습니다 . 나는 그것이 scala newbie이기 때문에 그것이라고 생각한다.

답변

1

면책 조항 답변이 적용되지만 Seq에는 padTo이라는 멋진 작은 방법이 있습니다.이 방법을 사용하면 시퀀스 내에 적어도 n 개의 값이 있음을 확인할 수 있습니다. 두 개의 매개 변수 length: Intelem: B을 취합니다. 여기에서 BSeq의 하위 유형입니다. 따라서 귀하의 경우에는 다음과 같습니다

for { 
    enterprise <- itr 
    enterpriseName <- enterprise \* EName \* Legal 
    enterprisePopularName <- (enterprise \* EName \* Popular).padTo(1, reasonableDefaultValue) 
} 
+0

은'\ *'옵션을 생산 하는가? 나는'Seq'를 기대합니다. – Impredicative

+0

감사합니다. 내 대답을 편집했습니다. – drexin

+0

Nice - 이전에'padTo '를 보지 못했습니다. – Impredicative

0

경고 : 나는 '저울'에 익숙하지 않은 나는, 여기에 세부 사항이 잘못 될 수 있도록. 특히, 당신은 찾을 수

  • \*는 반환하지 않는 Seq -이 경우 단지 IterableSeq을 대체하는에 Iterable, 또는 당신이 해결해야하는 경우 일부 사용자 지정 컬렉션을 반환 할 수 있습니다 아래의 번역 방법.
  • 반환되는 시퀀스는 Seq[String]이 아닌 Seq[Node] 또는 그와 비슷한 유형입니다. 노드를 기본값으로 사용하거나 기본값을 적용하기 전에 .map(_.toString)을 사용하여 시퀀스를 변환해야합니다.

여기서 \*은 어떤 종류의 시퀀스 (Scala 's Seq)를 반환한다고 가정합니다. 우리가 원하는 것은 Seq과 기본값을 취하는 방법이며, Seq이 비어 있으면 기본값을 생성합니다. 이것은 OptionorElse 또는 getOrElse 메소드의 등가물을 작성한 경우에 불과합니다.

여기에 우리가 할 수있는 한 가지 방법입니다 :

def orIfEmpty[A](xs : Seq[A], default : A) : Seq[A] = 
    if (xs.isEmpty) Seq(default) else xs 

는 그리고 지금 우리는 이해에서 이것을 사용할 수 있습니다

enterprisePopularName <- orIfEmpty(enterprise \* EName \* Popular, "")