2012-12-02 3 views
2

다양한 large xml 파일을 구문 분석하기 위해 scala.xml.pull을 사용하고 있습니다. 이것은 이벤트 처리에 효과적이지만, 내가하고 싶은 것은 내 파서가 특정 노드에 대해 미니 문서를 기침하도록하는 것인데, 이것을 수행하는 쉬운 방법이나 적어도 "스칼라"가 아닌 방법을 보지 못한다. 내가 덜 분명 해요 그 후scala.xml.pull을 사용하여 노드와 그 모든 자식을 추출하는 가장 좋은 방법은 무엇입니까?

def seek(tag: String) = { 
    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(_, `tag`, _, _) => 

:

나는 내 태그를 일치하는 EvElemStart 이벤트를 찾기 위해 반복자를 사용할 수있는이 같은 노력 기능은 빌드 생각하고 있어요. XMLEventReader가 튀어 나오는 모든 이벤트를 반복하지 않고이 태그의 모든 자식을 문서로 가져 오는 간단한 방법이 있습니까?

내가 궁극적으로 찾고있는 것은 파일을 스캔하고 일반 스칼라 xml 처리를 사용하여 처리 할 수있는 특정 태그 또는 태그 집합의 각 인스턴스에 대해 XML 요소 (Elem?)를 방출하는 프로세스입니다.

+0

간단한 스 니펫에서 원하는 동작에 대한 예로서 질문에 더 많은 정보를 추가 할 수 있습니까? –

답변

1

여기 내가 뭘 결국거야. slurp (태그)는 태그의 다음 인스턴스를 찾고 해당 태그에 대한 완전한 노드 트리를 반환합니다.

def slurp(tag: String): Option[Node] = { 
    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(pre, `tag`, attrs, _) => return Some(subTree(tag, attrs)) 
     case _ => 
    } 
    } 
    return None 
} 

def subTree(tag: String, attrs: MetaData): Node = { 
    var children = List[Node]() 

    while (it.hasNext) { 
    it.next match { 
     case EvElemStart(_, t, a, _) => { 
     children = children :+ subTree(t, a) 
     } 
     case EvText(t) => { 
     children = children :+ Text(t) 
     } 
     case EvElemEnd(_, t) => { 
     return new Elem(null, tag, attrs, xml.TopScope, children: _*) 
     } 
     case _ => 
    } 
    } 
    return null // this shouldn't happen with good XML 
}