2009-12-22 5 views
1

this post을 기반으로 특정 속성 값을 가지고있는 경우에만 이해를위한 노드를 추출하는 명확한 방법이 필요했습니다. 다음은 내가 생각해 낸 것입니다 :특정 값을 갖는 특정 속성을 가진 노드 만 추출하기

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs.map { p => 
    n.attribute(p._1).exists(_ == p._2) 
    } reduceLeft(_ && _) 

다음은 원자 피드에서 항목 개체를 추출하는 예제입니다.

def parseAtomItems(ns: NodeSeq) = ns \\ "entry" flatMap { i => 
    for(
    t <- i \ "title"; 
    l <- i.\("link").filter(attributeValue(
     "type" -> "text/html", 
     "rel" -> "alternate" 
     ).flatMap(_.attribute("href")) 
    ) yield FeedItem(t text, l text) 
} 

제 질문은 다음과 같습니다. attributeValue를 구현하는 데 더 깔끔하고 관용적 인 방법이 있습니까?

답변

2

나는 코드가 실제로 꽤 좋다라고 생각한다. 나는이 작업을 수행 할 것 : 또는

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs forall { 
    case (key, value) => n attribute key exists (_ == value) 
    } 

def attributeValue(attrs: (String, String)*)(n: Node) = 
    attrs forall { 
    case (key, value) => n \ ("@"+key) exists (_ == value) 
    } 

후자는 반복 반면 전자는 첫 번째 잘못된 결과에서 멈출 것 인 reduceLeft 이상 forall의 주요 장점 모든 키/값 쌍을 사용할 수 있습니다.

+0

반복 가능 # forall - 누락 된 부분입니다. 나는 다른 대답을 듣고 있지만 대니얼입니다. 감사합니다! – Chris

관련 문제