2011-01-07 4 views

답변

11

에있는 기존 \ 또는 \\ 방법으로는 아무 것도 할 수 없습니다. 하지만 포주 - 네 - 라이브러리 패턴에 따라, 새로운 \* 방법 (주 부족 또는 공백 문자)와 NodeSeq을 확장 할 수 있습니다 :

import xml.{NodeSeq, Elem} 

class ChildSelectable(ns: NodeSeq) { 
    def \* = ns flatMap { _ match {          
    case e:Elem => e.child         
    case _ => NodeSeq.Empty         
    } } 
} 

implicit def nodeSeqIsChildSelectable(xml: NodeSeq) = new ChildSelectable(xml) 

REPL에서,이는 저를 제공합니다 :

scala> val xml = <a><b><c>xxx</c></b></a> 
xml: scala.xml.Elem = <a><b><c>xxx</c></b></a> 

scala> xml \*                    
res7: scala.xml.NodeSeq = NodeSeq(<b><c>xxx</c></b>) 

scala> xml \ "b" \* 
res8: scala.xml.NodeSeq = NodeSeq(<c>xxx</c>) 

scala> xml \ "b" \ "c" \* 
res9: scala.xml.NodeSeq = NodeSeq(xxx) 
6

이 꽤 가까이 당신이 찾고있는 것을 :

import scala.xml.Elem 

val xml = <a><b><c>HI</c></b></a> 

println(xml) 
println(xml \ "_") 
println(xml \ "b") 
println(xml \ "b" \ "_") 
println(xml \ "b" \ "c") 
println(xml \ "b" \ "c" \ "_") 


<a><b><c>HI</c></b></a> 
<b><c>HI</c></b> 
<b><c>HI</c></b> 
<c>HI</c> 
<c>HI</c> 
// Empty 
+0

목 이 대답보다 낫다. ''_ ''은 새로운 방법을 쓸 필요없이 정확히 요구 한 것을 수행합니다. 코드를 유지하는 코드가 줄어들고 코드를 보는 다음 사람을 혼란스럽게하는 비표준 구문이 줄어 듭니다. – rumtscho

+0

이 awnser을 과대 평가하지 마십시오. scala-xml이 깨졌습니다. https://github.com/lihaoyi/scalatags 또는 https://github.com/chris-twiner/scalesXml과 같은 것을 사용하십시오. –

관련 문제